SQLite递归查询报错sqlite3.OperationalError near SELECT语法错误求助
SQLite递归查询语法错误修复方案
核心错误原因
- 错误1:
compute函数的两个入参都是标量子查询,SQLite要求作为函数参数的子查询必须用圆括号单独包裹,你当前直接将SELECT语句写在函数参数列表中,没有外层括号,是触发near "SELECT": syntax error的直接原因。 - 错误2:递归CTE
length的定义结束后多了一个多余的逗号,WITH子句中仅多个CTE并列时才用逗号分隔,最后一个CTE定义后不允许加逗号。
修复后的完整代码
WITH RECURSIVE length(len, id, ord) AS ( SELECT 0, t.id, 1 FROM temp t UNION SELECT len + compute( -- 子查询作为函数参数添加外层括号 (SELECT w2.nodeid FROM waypoint w2 WHERE w2.ordinal = ord AND w2.wayid = t.id), (SELECT w2.nodeid FROM waypoint w2 WHERE w2.ordinal = ord + 1 AND w2.wayid = t.id) ), t.id, w1.ordinal FROM waypoint w1, length, temp t WHERE w1.wayid = t.id AND w1.ordinal = ord + 1 ) -- 移除了CTE末尾的多余逗号 SELECT * FROM length
额外优化建议
如果不需要对递归返回的结果去重,可以将UNION替换为UNION ALL,能大幅提升递归查询的执行效率。另外建议将逗号分隔的隐式表连接写法替换为INNER JOIN显式连接,可读性更强。
内容的提问来源于stack exchange,提问作者saji
相关产品推荐
相关产品推荐

