1

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

4

2 回答 2

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;

这是TechNet 上的一个很好的参考。有一个选择经理和直接下属的好例子。

于 2014-07-11T14:27:47.373 回答
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

于 2014-07-11T14:02:07.527 回答