当前位置: 首页 > news >正文

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

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

  • SQL server
    SQL Server 对递归 CTE 有默认的递归深度限制(默认是 100),当递归次数超过这个限制时会报错。当远超默认限制时,需要在查询前使用 OPTION (MAXRECURSION 0) 来取消递归深度限制。
WITH RECURSIVE num_sequence AS (SELECT 1 AS NUMUNION ALLSELECT 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  -- 递归起点:生成第一个数字 1UNION ALLSELECT NUM + 1  -- 递归逻辑:每次在上一个数字基础上加 1FROM 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)”,可直接设置一个 大于或等于目标迭代次数 的值。

http://www.wxhsa.cn/company.asp?id=5105

相关文章:

  • leetcode 3541. 找到频率最高的元音和辅音 便捷
  • 匿名递归与不动点组合子
  • Markdown学习Day01
  • flutter compass结构代码分析
  • 25.9.15
  • 二十八、共享内存多处理器的基本概念
  • 详细介绍:【ARMv7】系统复位上电后的程序执行过程
  • C#高级语法
  • 配置Maven
  • 那两年的回忆录
  • DDR4基本介绍
  • 网络同步预测-Prediction
  • 二十五、多处理器的基本概念 (SISD/SIMD/MIMD)
  • java课堂问题2
  • 集训总结(六)
  • GAS_Aura-Prediction GAS
  • PromptPilot 产品发布:火山引擎助力AI提示词优化的新利器
  • 安装window版本docker
  • 已严肃完成今日特征多项式大学习
  • docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践
  • python_Day21_mysql(2)
  • .zip用法
  • vue2使用pnpm编译打包时的错误处理
  • 中南上课第一天
  • 二十四、深入理解CPU控制信号的最终使命
  • 20250915 - 状压dp 总结
  • PS2025安装包永久免费版下载安装教程Photoshop 2025 v26.0安装包永久免费版下载
  • 学校真是太棒了
  • 如果远程玩家过早结束异步任务,并且具有该集的任务仍在运行,则该任务被杀死-SetWaitingOnRemotePlayerData()
  • 9.15日总结