RECURSIVE CTE
处理层级或递归数据。
本页使用窗口函数或 CTE;MySQL 需要 8.0 及以上版本。
简介
递归 CTE 由锚点查询提供起始行,再由递归成员不断引用前一轮结果,直到不再产生新行。终止条件必须可证明,层级数据还要防止环路和重复路径;MySQL 8.0 的递归深度限制也应纳入异常处理。
基础语法
WITH RECURSIVE nums AS (SELECT 1 n UNION ALL SELECT n + 1 FROM nums WHERE n < 5) SELECT * FROM nums;
示例
RECURSIVE CTE 示例
示例从 1 开始递增,并用 n < 5 作为明确终止条件,最终只生成 1 到 5。
运行结果
| n |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
常见问题
递归 CTE 为什么必须有终止条件?
递归部分需要让数据逐步接近停止状态;否则可能一直生成记录,直到数据库达到递归深度或资源限制。
层级数据存在环时怎么办?
记录已访问的路径或节点,在递归条件中排除重复节点;同时保留数据库递归深度限制作为最后保护。
递归 CTE 很慢时先检查什么?
检查锚点规模、递归连接字段索引、每层新增行数与最大深度,避免在递归体内携带不必要的大字段。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。