递归CTE的逻辑处理

时间:2019-01-27 00:11:47

标签: sql sql-server tsql common-table-expression recursive-query

我不明白为什么递归成员调用cte时不调用锚。

为什么它要去递归部分中的最新记录(?)?

WITH Managers AS 
( 
--initialization 
SELECT EmployeeID, LastName, ReportsTo  
FROM Employees 
WHERE ReportsTo IS NULL 
UNION ALL 
--recursive execution 
SELECT e.employeeID,e.LastName, e.ReportsTo 
FROM Employees e INNER JOIN Managers m  
ON e.ReportsTo = m.employeeID 
) 
SELECT * FROM Managers

1 个答案:

答案 0 :(得分:1)

这是著名的Microsoft示例数据库if type(txt) is str: for i in txt: if i.isalpha() == False: txt = txt.replace(i," ") (自1997年以来不变)。 Northwind表演示了分层数据和递归CTE(1997年不可用)访问它的用法。

为了更好地理解/测试/培训目的,请增加一列

Emploeees

这是结果集。

WITH Managers AS 
( 
  --initialization 
  SELECT EmployeeID, LastName, ReportsTo, /*extra column*/ 0 [level]  
  FROM Employees 
  WHERE ReportsTo IS NULL 

  UNION ALL 

  --recursive execution 
  SELECT e.employeeID,e.LastName, e.ReportsTo, [level]+1 
  FROM Employees e 
  INNER JOIN Managers m ON e.ReportsTo = m.employeeID 
) 
SELECT * FROM Managers

因此 anchor 始终执行,递归部分执行 iff 锚返回行。