SQLite中使用WITH子句搭配INTERSECT出现语法错误如何解决?
问题根源
SQLite 对 WITH 子句的语法有明确限制:WITH 仅允许出现在单条完整SQL语句的最开头位置,不能出现在 INTERSECT、UNION、EXCEPT 这类集合操作符的后方。
你原写法的本质是把两条各自带独立 WITH 子句的查询直接用 INTERSECT 拼接,第二条查询开头的 WITH 违反了上述语法规则,因此触发语法报错。
正确实现方案
写法1:统一将所有CTE放在语句开头的同一个WITH块中(更推荐,可读性更高)
这是最符合SQL语法规范的写法,把两个需要用到的公共表表达式都定义在最开头,后续直接引用做交集运算即可:
WITH b AS ( SELECT person_id FROM people WHERE name='Ward Bond' AND born=1903 ), c AS ( SELECT person_id FROM people WHERE name='John Wayne' AND born=1907 ) SELECT title_id FROM b NATURAL JOIN crew INTERSECT SELECT title_id FROM c NATURAL JOIN crew;
写法2:将每条带WITH的查询包装为独立子查询
如果你不想合并CTE定义,也可以把两个独立查询分别包裹为子查询,此时每个子查询内部的WITH符合「在子查询块开头」的语法要求:
SELECT * FROM ( WITH b AS (SELECT person_id FROM people WHERE name='Ward Bond' AND born=1903) SELECT title_id FROM b NATURAL JOIN crew ) INTERSECT SELECT * FROM ( WITH c AS (SELECT person_id FROM people WHERE name='John Wayne' AND born=1907) SELECT title_id FROM c NATURAL JOIN crew );
两种写法都可以正确获取两个查询结果的交集。
内容的提问来源于stack exchange,提问作者Reza Namvar
相关产品推荐
相关产品推荐

