如何使用SQL Server 2008 hierarchyid创建累积的“派生”祖列列

时间:2010-07-07 15:34:43

标签: sql sql-server-2008

想象一下你典型的经理/员工层级,你有一个老板的员工,而老板又有老板,老板又有老板。

如何编写一个查询,其中包含一个列,例如,所有boss的名称都是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 个答案:

答案 0 :(得分:1)

因为您使用的是SQL 2008:

;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以决定是否在逗号前加上。