我在理解SQL中的这个递归CTE时遇到了麻烦,我可以理解大多数部分,但其中一个让我失望的地方是第二个子查询递归成员。它将EmployeeCTE连接到employees表,但根据我的逻辑,到那时为止,EmployeeCTE中将只有一行。它将只包含包含managerID = NULL的行。我还知道,在循环递归成员后它会给rank加1但它是如何选择正确的员工加1而不是其他行呢?
USE Examples;
WITH EmployeesCTE AS
(
-- Anchor member
SELECT EmployeeID,
FirstName + ' ' + LastName As EmployeeName,
1 As Rank
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
-- Recursive member
SELECT Employees.EmployeeID,
FirstName + ' ' + LastName,
Rank + 1
FROM Employees
JOIN EmployeesCTE
ON Employees.ManagerID = EmployeesCTE.EmployeeID
)
SELECT *
FROM EmployeesCTE
ORDER BY Rank, EmployeeID;
SELECT *
FROM Employees
递归成员的每次迭代都将选择前一个成员的子雇员:
-
锚查询检索所有在他们上面没有任何老板的顶级经理。
-
然后,在迭代#1时,递归查询使用谓词
Employees.ManagerID = EmployeesCTE.EmployeeID
检索上述查询的直接下级。 -
然后,在迭代#2时,递归查询只考虑在迭代#1中检索到的额外行并应用上述相同的谓词来检索这些词的从属词。
-
迭代#3等等,继续只考虑"新添加的行";每次,直到在迭代中没有找到更多的行。当这种情况发生时,递归CTE完成并结束执行。