递归成员循环中的递归 CTE 混淆

Recursive CTE confusion in looping of the recursive member

我在理解 SQL 中的这个递归 CTE 时遇到问题,我可以理解大部分内容,但让我失望的地方之一是递归成员的第二个子查询。它将 EmployeeCTE 连接到员工 table,但根据我的逻辑,到那时为止,EmployeeCTE 中只有一行。它将仅包含包含 managerID = NULL 的行。另外,我知道在循环遍历递归成员后,它会将 1 加到排名中,但是 select 正确的员工如何增加 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

递归成员的每次迭代都会select前一个成员的子雇员:

  • 锚查询检索所有没有上司的顶级经理。

  • 然后,在第 1 次迭代中,递归查询使用谓词 Employees.ManagerID = EmployeesCTE.EmployeeID.

    检索上面的直接下属
  • 然后,在第 2 次迭代中,递归查询仅考虑 在第 1 次迭代中检索到的额外行,并应用上面相同的谓词来检索这些。

  • 迭代#3 依此类推,每次只考虑“新添加的行”,直到在迭代中找不到更多行。当这种情况发生时,递归 CTE 完成并且其执行结束。