【问题标题】:Recursive CTE confusion in looping of the recursive member递归成员循环中的递归 CTE 混淆
【发布时间】:2021-09-27 02:04:18
【问题描述】:

我无法理解 SQL 中的这种递归 CTE,我可以理解大多数部分,但让我感到厌烦的领域之一是递归成员的第二个子查询。它将 EmployeeCTE 连接到 employees 表,但按照我的逻辑,到那时为止,EmployeeCTE 中只有一行。它将仅包含包含 managerID = NULL 的行。另外,我知道在它循环遍历递归成员后,它将为排名加 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

【问题讨论】:

    标签: sql common-table-expression recursive-query correlated-subquery


    【解决方案1】:

    递归成员的每次迭代都会选择前一个成员的子员工:

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

    • 然后,在第 1 次迭代中,递归查询使用谓词 Employees.ManagerID = EmployeesCTE.EmployeeID 检索上述的直接下属。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 2015-04-27
      • 2016-09-28
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多