sql - 递归CTE的逻辑处理
问题描述
我不明白为什么当递归成员调用 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
解决方案
这是著名的 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
所以锚总是执行,如果锚返回行,递归部分就会执行。
推荐阅读
- c++ - 我应该如何声明我的对象才能正确使用这些功能?
- java - 如何使用其他方法中定义的数组变量?
- visual-studio - 是否有适用于 Visual Studio 2019 的 Visual Studio 安装程序项目类型?
- java - Java 数组搜索和排序未按预期工作
- python - 无法在 python3 中使用 hashlib 将 sha1 编码为十六进制
- math - 扑克游戏中获胜组合的概率
- ruby-on-rails - RSpec 中的 --seed 选项
- python - 从递归算法到自下而上的动态规划方法
- javascript - 无法成功上传图片到s3然后查看
- python - ProactorEventLoop - ValueError:循环参数必须与 Future 一致