递归成员循环中的递归 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 完成并且其执行结束。
我在理解 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 完成并且其执行结束。