【问题标题】:Logical Processing of Recursive CTE递归CTE的逻辑处理
【发布时间】:2019-01-27 00:11:47
【问题描述】:

我不明白为什么递归成员调用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

【问题讨论】:

  • 请在问题中包含十几行样本数据,向我们展示您期望得到的结果以及您现在得到的结果。
  • 如果我从这篇文章中得到的信息是正确的,它回答了我的问题:stackoverflow.com/questions/3187850/…。递归部分的最新输出用于递归部分的输入。
  • 始终执行锚部分。你说“为什么它会进入最新记录?” -- 您是否对结果行进行排序?您是否有未提及的额外过滤条件?
  • 这是著名的 Northwind 数据库,查询产生预期结果,第一行是 CEO (ReportsTo NULL)。
  • this 是否回答微不足道的 rCTE 帮助?

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


【解决方案1】:

这是著名的 Microsoft 示例数据库 Northwind(自 1997 年以来不可变)。 Emploeees 表展示了分层数据和使用递归 CTE(1997 年不可用)来访问它。

为了更好地理解/测试/培训目的,添加一个额外的列

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

这是结果集。

EmployeeID  LastName             ReportsTo   level
----------- -------------------- ----------- -----------
2           Fuller               NULL        0 --anchor call
--now 'Managers' CTE is the anchor (level 0)
1           Davolio              2           1
3           Leverling            2           1
4           Peacock              2           1
5           Buchanan             2           1
8           Callahan             2           1
--now 'Managers' CTE is resultset level 1
6           Suyama               5           2
7           King                 5           2
9           Dodsworth            5           2

所以anchor总是执行,递归部分执行iffanchor返回行。

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 2017-07-13
    • 2020-03-30
    • 2018-08-02
    • 2012-12-12
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多