You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中如何正确编写先非递归后递归的CTE语句

问题根因

MySQL 对 CTE 的语法有明确要求:RECURSIVE 是 WITH 子句的级联关键字,不是单个递归 CTE 的修饰符,必须直接写在 WITH 关键字之后,作用于当前 WITH 块下的所有 CTE,和递归 CTE 的定义顺序没有关系。
你之前的写法把 RECURSIVE 写在了第二个递归 CTE 的定义前,不符合 MySQL 的语法解析规则,因此触发报错,和 CTE 的定义顺序本身无关。

修正方案

不需要调整非递归CTE、递归CTE的先后顺序,只需要把 RECURSIVE 关键字移动到 WITH 之后即可,修正后的可正常运行的代码如下:

WITH RECURSIVE
-- 非递归CTE放在最前,保留你需要的定义顺序
simple_cte AS (
    SELECT 15 AS user_id
),
-- 递归CTE放在后面,前面不需要单独加RECURSIVE
recur_cte AS (
    SELECT 1 AS id
    UNION ALL
    SELECT id + 1 FROM recur_cte WHERE id <= (SELECT min(user_id) FROM simple_cte)
)
SELECT * FROM recur_cte;
补充规则说明
  • 只要同一个WITH块内存在任意一个递归CTE,就必须在WITH后追加RECURSIVE关键字,和递归CTE排在第几位无关
  • CTE之间的引用只要求被引用的CTE定义在引用它的CTE之前,你原本先定义simple_cte、后定义引用它的recur_cte的顺序本身是完全符合逻辑的,不需要调换
  • 禁止在单个CTE名称前单独写RECURSIVE,该关键字不属于单CTE的语法部分

内容的提问来源于stack exchange,提问作者Akanksha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:51:24