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
相关产品推荐
相关产品推荐

