在SQLite版本3.7.12.1(控制台)中,此查询不起作用:
(SELECT * FROM A UNION SELECT * FROM B) EXCEPT (SELECT * FROM A INTERSECT SELECT * FROM B);
错误信息
错误:第1行附近:“(”附近:语法错误
该查询在SQL Server Management Studio中有效。其他带有方括号的查询确实可以正常工作。我想念什么吗?
编辑:澄清:
SELECT * FROM A; <-- works (SELECT * FROM A); <-- does not work [Error: near line 1: near "(": syntax error] SELECT * FROM A WHERE A.id IN (SELECT B.id FROM B); <-- works, so no fundamental issues with brackets and sqlite...
好像SQLite不等组合(分)查询(那些具有UNION,UNION ALL,EXCEPT或INTERSECT),以进行包围曝光:
UNION
UNION ALL
EXCEPT
INTERSECT
这 不起作用 :
(SELECT 1 AS v
UNION SELECT 2) EXCEPT SELECT 1
这 也 不起作用:
SELECT 1 AS v
UNION (SELECT 2 EXCEPT SELECT 1)
(但是两者都 可以在SQL Server中使用。)
而且没有括号,各个子选择将按顺序组合,即,像其他某些SQL产品一样,任何运算符都没有固有的优先级。(例如,
SELECT 1 AS v UNION SELECT 2 INTERSECT SELECT 3
返回1在SQL Server(因为INTERSECT执行第一),并没有在SQLite的。)
1
唯一的解决方法似乎是将要组合的部分用作子查询,如下所示:
SELECT * FROM ( SELECT * FROM A UNION SELECT * FROM B ) EXCEPT SELECT * FROM ( SELECT * FROM A INTERSECT SELECT * FROM B )