使用hierarchyid查詢分層資料

2021-09-12 18:36:19 字數 2887 閱讀 1856

目錄

誰為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...