SQLPathLab
CTE 与递归 · 高级

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。

运行结果

result
n
1
2
3
4
5

常见问题

递归 CTE 为什么必须有终止条件?

递归部分需要让数据逐步接近停止状态;否则可能一直生成记录,直到数据库达到递归深度或资源限制。

层级数据存在环时怎么办?

记录已访问的路径或节点,在递归条件中排除重复节点;同时保留数据库递归深度限制作为最后保护。

递归 CTE 很慢时先检查什么?

检查锚点规模、递归连接字段索引、每层新增行数与最大深度,避免在递归体内携带不必要的大字段。

标签

过滤数据

这篇内容是否清楚?