2012-05-30 30 views
8

W SQLite w wersji 3.7.12.1 (konsoli) ta kwerenda nie działa:SQLite Bracket "nie działają"

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

Komunikat o błędzie

Error: near line 1: near "(": syntax error

Ta kwerenda działa w SQL Server Management Studio . Inne zapytania z nawiasami działają zgodnie z oczekiwaniami. Czy czegoś brakuje?

Edycja: wyjaśnienie:

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

o ** edycja ** przykładów: to jest poprawne zachowanie według 'ANSI SQL' – triclosan

Odpowiedz

6

Wydaje się SQLite nie lubi łącznie (sub) zapytania (te z UNION, UNION ALL, EXCEPT lub INTERSECT) do nawiasach:

  • to nie wykonuje pracy:

    (SELECT 1 AS v 
    UNION 
    SELECT 2) 
    EXCEPT 
    SELECT 1 
    
  • to nie praca albo: (. Ale bothwork w SQL Server)

    SELECT 1 AS v 
    UNION 
    (SELECT 2 
    EXCEPT 
    SELECT 1) 
    

I bez nawiasów, poszczególne obsługę żądań są połączone sekwencyjnie, tj. nie ma żadnego nieodłącznego priorytetu dla żadnego z operatorów, jak w niektórych innych produktach SQL. (Na przykład, ten

SELECT 1 AS v 
UNION 
SELECT 2 
INTERSECT 
SELECT 3 

returns 1 w SQL Server (bo INTERSECT wykonywana jest pierwsza) i nothing w SQLite).

Jedyne obejście wydaje się być użycie części, które chcesz połączyć, jak podzapytaniami , like this:

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

nie działa, mam edytowany moje pierwotne pytanie do zawężenia problemu. – user1425798