当前位置: 首页 > 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.zskr.cn/news/5586.html

相关文章:

  • leetcode 3541. 找到频率最高的元音和辅音 便捷
  • 匿名递归与不动点组合子
  • flutter compass结构代码分析
  • 详细介绍:【ARMv7】系统复位上电后的程序执行过程
  • 网络同步预测-Prediction
  • 集训总结(六)
  • PromptPilot 产品发布:火山引擎助力AI提示词优化的新利器
  • 安装window版本docker
  • python_Day21_mysql(2)
  • .zip用法
  • vue2使用pnpm编译打包时的错误处理
  • 二十四、深入理解CPU控制信号的最终使命
  • 9.15日总结
  • 二十三、流水线的起点为何无需指挥?深入理解IF与ID这两个“公共流水段”
  • nc工具使用 - 谷粒
  • Azure App Service连接Azure SQL MI
  • 将目标数据复制到服务器-ServerSetReplicatedTargetData()
  • 不是说 PHP 不行了吗?为什么 Swoole 还在更新?
  • qoj1831 Bruteforce
  • C++数据结构和算法:链表
  • 详细介绍:Maven入门_简介、安装与配置
  • train-labels.idx1-ubyte里是什么
  • 创建预测窗口-ScopedPredictionWindow();
  • Ability-GetCurrentActorInfo()-IsLocallyControlled()和APawn::IsLocallyControlled()
  • 应该遵守的代码规范与读《数学之美》有感
  • AT_arc171_c [ARC171C] Swap on Tree
  • 新媒体运营用AI排版工具|10分钟搞定公众号图文的全流程指南
  • ctf工具整理
  • 250915 jave se简单过完一遍
  • AT_arc183_b [ARC183B] Near Assignment