什么是让所有孩子和孙子女或n代孩子的正确方法。 对于子女和孙子女,我的查询如下:
SELECT e1.ID, e1.LName + ', '+e1.FName
FROM lstEmp e1 INNER JOIN lstEmp e2 ON e1.Supervisor = e2.ID
Where e2.Supervisor = 'xxxxxxx'
UNION
SELECT distinct e2.ID, e2.LName + ', '+e2.FName
FROM lstEmp e1 INNER JOIN lstEmp e2 ON e1.Supervisor = e2.ID
Where e2.Supervisor = 'xxxxxxx'
我的问题:1)这是正确的方法吗? 2)如果我需要所有的孩子和孙子女和(4,5 ..)n代孩子怎么办?
答案 0 :(得分:1)
以下CTE以ID
=' xxx'行开头。然后,通过ID
加入Supervisor
来选择其子女和孙子女。
WITH grandchildren as
(
SELECT e1.ID ID, e1.LName + ', '+e1.FName FullName, 0 as lvl
FROM lstEmp e1
WHERE e1.ID ='xxx'
UNION ALL
SELECT e2.ID, e2.LName + ', '+e2.FName, lvl+1
FROM lstEmp e2
INNER JOIN grandchildren g ON e2.Supervisor = g.LsuID
)
SELECT *
FROM grandchildren
ORDER BY lvl, ID;
这里是great reference on TechNet。有一个选择经理和直接报告的好例子。
答案 1 :(得分:0)
如果你可以改变表模式,我会说最好的方法就是在你的表中使用HierarchyId数据类型,它专门针对你遇到的问题而设计。有关详细信息,请参阅此处的文档http://msdn.microsoft.com/en-gb/library/bb677290.aspx和此处http://msdn.microsoft.com/en-us/library/bb677173.aspx。
如果你不能改变表格,我会在存储过程中使用游标并以这种方式返回结果 - 这里的例子很好:T-SQL Stored Procedure for Looping a hierarchy with recursion