2012-05-30 12 views
8

In SQLite versione 3.7.12.1 (console) questa query non funziona:SQLite Staffa "non funzionano"

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

Messaggio di errore

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

Questa query funziona in SQL Server Management Studio . Altre query con parentesi funzionano come previsto. Mi sto perdendo qualcosa?

Edit: Per chiarire:

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

su ** Modifica ** esempi: è corretto comportamento in base a 'ANSI sql' – triclosan

risposta

6

Sembra come SQLite non piace (sub) query combinate (quelli con UNION, UNION ALL, EXCEPT o INTERSECT) da parentesi:

  • questo non lavoro:

    (SELECT 1 AS v 
    UNION 
    SELECT 2) 
    EXCEPT 
    SELECT 1 
    
  • questo non lavoro o: (. Ma bothwork in SQL Server)

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

E senza staffe, i singoli subselect sono combinati in modo sequenziale, cioè non c'è una priorità intrinseca per nessuno degli operatori come in altri prodotti SQL. (Per esempio, questo

SELECT 1 AS v 
UNION 
SELECT 2 
INTERSECT 
SELECT 3 

returns 1 in SQL Server (perché INTERSECT viene eseguita per prima) e nothing in SQLite.)

L'unica soluzione sembra essere quella di utilizzare le parti che si desidera unire, come subquery , 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

non funziona, ho curato la mia domanda originale per circoscrivere il problema. – user1425798