小编典典

SQLite支架“不起作用”。

sql

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

阅读 182

收藏
2021-05-16

共1个答案

小编典典

好像SQLite不等组合(分)查询(那些具有UNIONUNION ALLEXCEPTINTERSECT),以进行包围曝光:

  • 不起作用

    (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
)
2021-05-16