WITH RECURSIVE 递归公用表表达式(CTE)

生成一个从 1 到 12352 的连续数字序列

  • SQL server
    SQL Server 对递归 CTE 有默认的递归深度限制(默认是 100),当递归次数超过这个限制时会报错。当远超默认限制时,需要在查询前使用 OPTION (MAXRECURSION 0) 来取消递归深度限制。
WITH RECURSIVE num_sequence AS (
    SELECT 1 AS NUM
    UNION ALL
    SELECT NUM + 1 FROM num_sequence WHERE NUM < 12352
)
SELECT * FROM num_sequence
OPTION (MAXRECURSION 0); -- 0 表示无限制
  • MySQL
    如果 MySQL 版本低于 8.0(不支持 CTE),则需要通过创建临时表的方式生成数字序列来实现相同功能。
    MySQL 同样有默认的递归深度限制,通过 max_recursion_depth (8.0.3前) 系统变量控制递归 CTE 的最大迭代次。8.0.3 版本起,用于控制递归 CTE 迭代上限的变量名称是 cte_max_recursion_depth ,它的默认数值为 1000 。
    查询 递归深度语句SHOW VARIABLES LIKE 'cte_max_recursion_depth;
-- 第一步:临时取消递归深度限制。
 SET cte_max_recursion_depth = 12352 ;

-- 第二步:执行递归 CTE 生成序列
WITH RECURSIVE num_sequence AS (
    SELECT 1 AS NUM  -- 递归起点:生成第一个数字 1
    UNION ALL
    SELECT NUM + 1  -- 递归逻辑:每次在上一个数字基础上加 1
    FROM num_sequence 
    WHERE NUM < 12352 -- 递归终止条件:数字小于 12352 时继续,等于 12352 时停止
)
SELECT * FROM num_sequence;

-- 第三步:设回原来的递归深度限制
 SET cte_max_recursion_depth = 1000;

MySQL 8.0.3 ~ 8.0.16 之间的部分版本,对 cte_max_recursion_depth = 0 的支持存在小 bug,可能误判递归次数。不使用 “无限制(0)”,可直接设置一个 大于或等于目标迭代次数 的值。

posted @ 2025-09-15 22:57  ꧁༺星星的轨迹方程式༻꧂  阅读(31)  评论(0)    收藏  举报