2012-05-30 26 views
8

In SQLite-Version 3.7.12.1 (Konsole) diese Abfrage nicht funktioniert:SQLite Bracket "nicht funktionieren"

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

Fehler

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

Diese Abfrage funktioniert in SQL Server Management Studio . Andere Abfragen mit Klammern funktionieren wie erwartet. Fehle ich etwas?

Edit: zu klären:

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

über ** ** Bearbeiten Beispiele: es richtiges Verhalten ist nach 'ANSI SQL' – triclosan

Antwort

6

Scheint, wie SQLite nicht kombiniert mag (Teil-) Anfragen (die mit UNION, UNION ALL, EXCEPT oder INTERSECT) eingeklammert werden:

  • nicht Arbeit:

    (SELECT 1 AS v 
    UNION 
    SELECT 2) 
    EXCEPT 
    SELECT 1 
    
  • diese nicht Arbeit entweder: (. Aber bothwork in SQL Server)

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

Und ohne Klammern sind die einzelnen Subselects sequenziell kombiniert, Dh es gibt keine inhärente Priorität für irgendeinen der Operatoren wie in einigen anderen SQL-Produkten. (Zum Beispiel diese

SELECT 1 AS v 
UNION 
SELECT 2 
INTERSECT 
SELECT 3 

returns 1 in SQL Server (weil INTERSECT zuerst ausgeführt) und nothing in SQLite.)

Die einzige Lösung scheint die Teile verwenden Sie, wie Unterabfragen kombinieren möchten , 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

nicht funktioniert, habe ich meine ursprüngliche Frage bearbeitet, das Problem zu verengen. – user1425798