Скобка 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. (Например,
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
)