目錄
誰為jolynn工作?
使用hierarchyid函式回答
hierarchyid型別內建函式
在本文中,我們將介紹如何執行乙個查詢以獲取層次結構的一部分。對於這個問題,我們將使用
adventureworks
資料庫。
employee
表中隱藏的是
adventureworks
的組織結構。雖然
hris
專家擅長基本的
select
和joins
,但她很難找到向
jolynn dobney
報告的人。
你可以通過編寫一些
t-sql
來找到jolynn
的所有直接報告來幫助她嗎?對於每個直接報告,輸出其
jobtitle
,first name
和last name
。寫下你的查詢,然後看看下面我是怎麼做到的!
在我們得到答案之前,讓我們掌握一些術語。分層資料可以作為樹。在下圖中,您將看到組織結構圖。樹是顛倒的,因為它在頁面上「分支
」,而不是向天空。
請注意,樹以root開頭,這是樹的開頭。
此外,樹中的每個節點都連線到零個或多個其他節點。任何節點都可以被視為父節點。從中分支的任何節點都是子節點。
使用家譜隱喻,父母有死者,即孩子。孩子們有祖先,父母和祖父母
......
我老了,所以我習慣在資料庫中使用的大部分分層資料都是
parentid
列的形式,是主鍵的外來鍵。
例如,employeeid
是主鍵,
manager id
是父鍵。
在adventure works
資料庫中,這是不同的。這裡使用
hierarchyid
型別傳達報告結構。此型別提供了使用乙個字段關聯父子關係的方法。
hierarchyid
值是雜湊值。它的值在於我們可以用來導航層次結構的內建函式,例如:
為了解決這個問題,我將使用getancestor函式返回父級
hierarchyid
。我們的想法是首先獲取
jolynn
的hierarchyid
,然後返回祖先
hierarchyid
與她匹配的所有記錄。
下面是我用來編寫查詢的**。在第一部分中,我們得到了
jolynn
的hierarchyid。
在第二部分中,我們得到了員工老闆的等級制度。如果它與
jolynn
的hierarchyid
匹配,那麼我們在結果中保留行
...
--get direct reports
--part 1: find jolynn』s hierarchyid in employee database
declare @currentemployee hierarchyid;
select @currentemployee=organizationnode
from humanresources.employee e
inner join person.person p on
e.businessentityid = p.businessentityid
where p.firstname ='jolynn' and p.lastname ='dobney';
--part 2: find all direct reports for jolynn
select e.jobtitle,
p.firstname,
p.lastname
from humanresources.employee e
inner join person.person p on
e.businessentityid = p.businessentityid
where organizationnode.getancestor(1)= @currentemployee;
這是使用
子查詢編寫相同**的另一種方法!
select e.jobtitle,
p.firstname,
p.lastname
from humanresources.employee e
inner join person.person p on
e.businessentityid = p.businessentityid
where organizationnode.getancestor(1)=
(select organizationnode
from humanresources.employee e
inner join person.person p on
e.businessentityid = p.businessentityid
where p.firstname ='jolynn' and p.lastname ='dobney')
子查詢返回單個值,與我們將其儲存到
@currentemployee
的第一步中返回的值相同。
Hierarchyid 常用操作
內建函式 select hierarchyid getroot 0x select hierarchyid parse 1 1 0x5ac0 select cast 0x5ac0 as hierarchyid 0x5ac0 select cast 1 as hierarchyid 0x5ac0 se...
Hierarchyid 常用操作
內建函式 select hierarchyid getroot 0x select hierarchyid parse 1 1 0x5ac0 select cast 0x5ac0 as hierarchyid 0x5ac0 select cast 1 as hierarchyid 0x5ac0 se...
hierarchyid有關的一些函式
於hierarchyid有關的一些函式主要有 getancestor 取得某乙個級別的祖先 getdescendant 取得某乙個級別的子代 getlevel 取得級別 getroot 取得根 isdescendantof 判斷某個節點是否為某個節點的子代 parse 將字串轉換為hierarchy...