with recursive cte (n) as ( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5 ) SELECT * FROM cte 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'recursive cte (n) as ( SELECT 1 UNION ALL SELECT n + 1 FROM cte WH' at line 1
时间: 2023-07-02 17:22:12 浏览: 95
这个错误提示表明你的 MySQL 版本不支持 with recursive 查询语句。with recursive 查询语句是在 MySQL 8.0.1 版本中引入的,如果你的 MySQL 版本低于 8.0.1,就无法使用 with recursive。
如果你的 MySQL 版本低于 8.0.1,你可以考虑使用其他方法来实现递归查询,例如使用存储过程或函数等。如果你的 MySQL 版本高于 8.0.1,可以检查你的查询语句是否存在其他语法错误,并根据错误提示进行修正。
在你的查询语句中,with recursive 子句的语法是正确的,但是在你的 MySQL 版本中不支持这种语法。可以使用以下命令检查你的 MySQL 版本:
```
SELECT VERSION();
```
如果你的 MySQL 版本低于 8.0.1,你需要升级你的 MySQL 版本才能使用 with recursive 查询语句。
相关问题
set m = m - 1; with recursive cte (id, cur, pre) as ( select 0, 0, 0 union all select id + 1, if (id < 2, 1, cur + pre), cur from cte where id < m ) select id n, cur fibn from cte; end $$
这段代码看起来像是一个递归函数,计算斐波那契数列的前 m 项,并将结果以表格的形式返回。其中 m 是一个变量,表示需要计算的斐波那契数列的项数。这个函数使用了 Common Table Expression (CTE) 进行递归调用,每次调用都会计算出当前项的值,并将其存储在 cur 中,同时将前一项的值存储在 pre 中,以便计算下一项的值。最终,函数将返回一个包含斐波那契数列前 m 项的表格,其中每一行表示一个斐波那契数列的项和它的值。
将WITH RECURSIVE cte AS ( SELECT * FROM dept WHERE id = '指定ID' UNION ALL SELECT d.* FROM dept d INNER JOIN cte ON d.parent_id = cte.id)SELECT * FROM cte ORDER BY id;变成开窗函数
可以使用以下的开窗函数来替换递归查询:
```
SELECT id, name, parent_id,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT NULL)) AS level
FROM (
SELECT id, name, parent_id,
CONNECT_BY_ROOT id AS root_id,
LEVEL
FROM dept
START WITH id = '指定ID'
CONNECT BY PRIOR parent_id = id
)
ORDER BY id;
```
这个查询使用了 Oracle 中的 CONNECT BY 语法来实现树形结构的查询,并使用 ROW_NUMBER() 开窗函数来为每个节点分配一个层级。其中,CONNECT_BY_ROOT 可以获取根节点的 ID,LEVEL 可以获取当前节点的深度。