sql查询获取所有子孙

时间:2014-07-11 13:50:19

标签: sql-server tree-structure

什么是让所有孩子和孙子女或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代孩子怎么办?

2 个答案:

答案 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