12

在 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...
4

2 回答 2

11

似乎 SQLite 不喜欢将组合(子)查询(带有 , 或 的查询UNION)括UNION ALL起来:EXCEPTINTERSECT

  • 不起作用

    (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 中没有返回。)

唯一的解决方法似乎是将要组合的部分用作子查询,如下所示

SELECT *
FROM (
  SELECT * FROM A
  UNION
  SELECT * FROM B
)
EXCEPT
SELECT *
FROM (
  SELECT * FROM A
  INTERSECT
  SELECT * FROM B
)
于 2012-05-31T07:06:17.340 回答
0
((SELECT * FROM A)
UNION
(SELECT * FROM B))
EXCEPT
((SELECT * FROM A)
INTERSECT
(SELECT * FROM B));
于 2012-05-30T10:44:11.853 回答