2013-07-24 36 views
3

我有兩個表 - 「用戶」和「監督」SQL查詢顯示heirarchical數據

在這個例子中,我的用戶表很簡單: -

Users 
===== 
ID (PK) 
UserName 

有些用戶管理其他用戶,所以我已經建立了第二個表「監督」來管理這樣的: -

Supervision 
=========== 
UserID 
SuperID - this is the ID of the staff member that the user supervises. 

此表用於連接用戶表與自身識別特定用戶主管。這可能是因爲一個用戶有多個主管,所以這個表完美地完成了這個任務。

這裏是我的樣本數據中「用戶」: -

userID userName 
1  Bob 
2  Margaret 
3  Amy 
4  Emma 
5  Carol 
6  Albert 
7  Robert 
8  Richard 
9  Harry 
10  Arthur 

和我的「監督」的數據: -

userID superID 
1  2 
1  3 
2  4 
2  5 
3  4 
3  5 
6  1 
6  7 
7  8 
7  9 
9  10 

如果我想看到誰直接向鮑勃,寫作SQL查詢非常簡單,並告訴我瑪格麗特和艾米是他的直接下屬。

然而我想要做的是編寫一個查詢,顯示每個人在Bob下,所以它需要看Bobs直接報告,然後他們的直接報告,等等 - 它會給瑪格麗特,艾米,艾瑪和卡羅爾作爲結果在這種情況下。

我假設這需要某種遞歸的,但我完全被卡住..

回答

2

你應該使用recursive CTE

WITH RCTE AS 
(
    SELECT * FROM dbo.Supervision WHERE UserID = 1 
    UNION ALL 
    SELECT s.* FROM dbo.Supervision s 
     INNER JOIN RCTE r ON s.userID = r.superID 
) 
SELECT DISTINCT u.userID, u.userName 
FROM RCTE r 
LEFT JOIN dbo.Users u ON r.superID = u.userID 

SQLFiddle DEMO

+0

這是否顧及誰管理,誰在下面,這似乎只帶回4分的結果嗎? – JsonStatham

+0

@SelectDistinct當然。該例中只有4個結果。嘗試爲位於層次結構之上的用戶6運行它,並且您將得到其下的所有9個其他用戶。 http://sqlfiddle.com/#!6/c100f/2 –

+0

啊我看到了,我的答案是否也做同樣的事情?我根據OP的例子創建了表格,結果在20分左右,這就是爲什麼我變得困惑的原因 – JsonStatham

1
WITH MyCTE 
AS ( 

-- ID's and Names 
SELECT SuperID, ID 
FROM Users 
join dbo.Supervision 
on ID = dbo.Supervision.UserID 
WHERE UserID = 1 

UNION ALL 

--Who Manages who... 
SELECT s.SuperID, ID 
FROM Supervision s 
INNER JOIN MyCTE ON s.UserID = MyCTE.SuperID 
WHERE s.UserID IS NOT NULL 

) 

SELECT distinct MyCTE.ID, NAMES.UserName, '<------Reports to ' as Hierarchy, res_name.UserName 
FROM MyCTE 
join dbo.Users NAMES on 
MyCTE.ID = NAMES.ID 

join dbo.Users res_name 
on res_name.ID = MyCTE.SuperID 

order by MyCTE.ID, NAMES.UserName, res_name.UserName