所以你想了解递归 CTE。
这真的很简单。
首先是获取原始记录的种子查询。
SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate
FROM HumanResources.Employee
WHERE ManagerID IS NULL
就您而言,这是没有经理的员工。
哪个是老板
用一个简化的例子来演示:
EmployeeID LoginID ManagerID Title
---------- ------- --------- ------------
101 boss NULL The Boss
第二个查询查找先前具有经理记录的员工。
SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate
FROM HumanResources.Employee e
INNER JOIN Emp_CTE ecte ON ecte.EmployeeID = e.ManagerID
由于它是递归 CTE,因此 CTE 在第二个查询中使用自身。
您可以将其视为一个循环,它使用前一个记录来获取下一个记录。
对于该递归循环的第一次迭代,您可能会得到如下结果:
EmployeeID LoginID ManagerID Title
---------- ------- --------- ------------
102 head1 101 Top Manager 1
103 head2 101 Top Manager 2
对于第二次迭代,它将使用第一次迭代中的记录来查找下一次迭代。
EmployeeID LoginID ManagerID Title
---------- ------- --------- ------------
104 bob 102 Department Manager 1
105 hilda 102 Department Manager 2
108 john 103 Department Manager 4
109 jane 103 Department Manager 5
对于第三次迭代,它将使用第二次迭代的记录。
...
这种情况一直持续到没有更多员工可以加入 ManagerID 为止
然后,在所有循环之后,CTE 将返回通过所有这些迭代找到的所有记录。