在SQLite版本3.7.12.1(控制台)中,此查询不起作用:
(SELECT * FROM A
UNION
SELECT * FROM B)
EXCEPT
(SELECT * FROM A
INTERSECT
SELECT * FROM B);
Run Code Online (Sandbox Code Playgroud)
错误信息
错误:靠近第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...
Run Code Online (Sandbox Code Playgroud)
好像SQLite不喜欢组合(分)查询(那些具有UNION,UNION ALL,EXCEPT或INTERSECT),以进行包围曝光:
这不起作用:
(SELECT 1 AS v
UNION
SELECT 2)
EXCEPT
SELECT 1
Run Code Online (Sandbox Code Playgroud)这也不起作用:
SELECT 1 AS v
UNION
(SELECT 2
EXCEPT
SELECT 1)
Run Code Online (Sandbox Code Playgroud)并且没有括号,各个子选择按顺序组合,即对于任何其他SQL产品中的任何运算符都没有固有的优先级.(例如,这个
SELECT 1 AS v
UNION
SELECT 2
INTERSECT
SELECT 3
Run Code Online (Sandbox Code Playgroud)
1在SQL Server中返回(因为INTERSECT首先执行)而在SQLite中没有任何内容.)
唯一的解决方法似乎是使用要组合的部分作为子查询,如下所示:
SELECT *
FROM (
SELECT * FROM A
UNION
SELECT * FROM B
)
EXCEPT
SELECT *
FROM (
SELECT * FROM A
INTERSECT
SELECT * FROM B
)
Run Code Online (Sandbox Code Playgroud)