2010-07-07 82 views
1

想象一下你典型的經理/員工層次結構,你有一個僱員與一個老闆,他又有一個老闆,而老闆又有一個老闆老闆。如何使用SQL Server 2008建立一個祖先的累積「派生」列hierarchyid

你會如何編寫一個查詢,該查詢將包含所有老闆名稱的列作爲varchar。

鑑於這一數據(而忽略了HIERARCHYID列,但這裏的id列本質上描述該列):

id | name   | bossid 
1 | BigBoss  | 0 
2 | CTO   | 1 
3 | CTO Lackey | 2 
4 | CIO   | 1 
5 | CIO Lackey | 4 

結束了這個結果集:

id | name   | all boss names 
1 | BigBoss  | 
2 | CTO   |Big Boss 
3 | CTO Lackey |Big Boss, CTO 
4 | CIO   |Big Boss 
5 | CIO Lackey |Big Boss, CIO 

謝謝!

回答

1

既然你是在2008年SQL:

;WITH CTE_Tree AS 
(
    SELECT 
     id, 
     name, 
     '' AS boss_names 
    FROM 
     My_Table 
    WHERE 
     boss_id IS NULL 
    UNION ALL 
    SELECT 
     T.id, 
     T.name, 
     CTE.boss_names + ', ' + CTE.name 
    FROM 
     CTE_Tree CTE 
    INNER JOIN My_Table T ON 
     T.boss_id = CTE.id 
) 
SELECT 
    id, 
    name, 
    boss_names 
FROM 
    CTE_Tree 

這是從我的頭頂,所以你可能需要調整它。它在boss_names的開頭會有一個額外的逗號。你可以在你的最終查詢中刪除它,或者在CTE中檢查CTE.boss_names,以決定是否加上逗號。

+0

謝謝!該訣竅 – 2010-07-07 17:51:05