如何遍历树/使用SQL代码中的分层数据

Alb*_*ert 15 sql sql-server sql-server-2008

假设我有一张员工表,其中包含我公司每位员工的记录,以及一份主管专栏(如下所示).我想准备一份报告,其中列出了监管线中每个步骤的名称和标题.例如,对于迪克罗宾斯,1d#15,我想在他的"指挥系统"中列出每个主管,一直到总统,大奶酪.我想避免使用游标,但如果这是唯一的方法,那就没关系.

id  fname   lname   title   supervisorid
1   big     cheese  president   1
2   jim     william vice president  1
3   sally   carr    vice president  1
4   ryan    allan   senior manager  2
5   mike    miller  manager 4
6   bill    bryan   manager 4
7   cathy   maddy   foreman 5
8   sean    johnson senior mechanic 7
9   andrew  koll    senior mechanic 7 
10  sarah   ryans   mechanic    8
11  dana    bond    mechanic    9
12  chris   mcall   technician  10
13  hannah  ryans   technician  10
14  matthew miller  technician  11
15  dick    robbins technician  11
Run Code Online (Sandbox Code Playgroud)

真正的数据可能不会超过10个级别...但我宁愿不只是做10个外部联接...我希望有比这更好的东西,并且比游标更少参与.

谢谢你的帮助.

Nei*_*l N 21

这基本上是我在OP评论中链接到的问题的接受答案的一个端口.

你可以使用公用表表达式

WITH Family As 
( 
    SELECT e.id, e.supervisorid, 0 as Depth
    FROM Employee e
    WHERE id = @SupervisorID 
    UNION All 
    SELECT e2.ID, e2.supervisorid, Depth + 1
    FROM Employee e2
        JOIN Family 
            On Family.id = e2.supervisorid 
) 
SELECT*
FROM Family 
Run Code Online (Sandbox Code Playgroud)

更多:

使用公用表表达式的递归查询