Скобка SQLite " не работает"

в SQLite версии 3.7.12.1 (консоль) этот запрос не работает:

(SELECT * FROM A
UNION
SELECT * FROM B)
EXCEPT
(SELECT * FROM A
INTERSECT
SELECT * FROM B);

сообщение об ошибке

Error: near line 1: near " ( " : синтаксическая ошибка

этот запрос работает в среде SQL Server Management Studio. Другие запросы со скобками работают так, как ожидалось. Я что-то упускаю?

Edit: для уточнения:

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

2 ответов


похоже, SQLite не любит комбинированные (sub)запросы (те, с 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.)

единственным обходным путем, похоже, является использование частей, которые вы хотите объединить, в качестве подзапросов,такой:

SELECT *
FROM (
  SELECT * FROM A
  UNION
  SELECT * FROM B
)
EXCEPT
SELECT *
FROM (
  SELECT * FROM A
  INTERSECT
  SELECT * FROM B
)

((SELECT * FROM A)
UNION
(SELECT * FROM B))
EXCEPT
((SELECT * FROM A)
INTERSECT
(SELECT * FROM B));