2012-05-30 11 views
8

En la versión 3.7.12.1 SQLite (consola) esta consulta no funciona:SQLite Soporte "no funcionan"

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

mensaje de error

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

Esta consulta funciona en SQL Server Management Studio . Otras consultas con corchetes funcionan como se esperaba. ¿Me estoy perdiendo de algo?

Editar: para aclarar:

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

sobre ** Editar ** ejemplos: es el comportamiento correcto de acuerdo a la norma ANSI 'sql' – triclosan

Respuesta

6

parece como SQLite no le gusta consultas (sub) combinados (aquellos con UNION, UNION ALL, EXCEPT o INTERSECT) para ser entre corchetes:

  • este no trabajo:

    (SELECT 1 AS v 
    UNION 
    SELECT 2) 
    EXCEPT 
    SELECT 1 
    
  • este no trabajo ya sea: (. Pero bothwork en SQL Server)

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

Y sin los soportes, los subselects individuales se combinan de forma secuencial, es decir, no hay prioridad inherente a ninguno de los operadores como en otros productos de SQL. (Por ejemplo, esta

SELECT 1 AS v 
UNION 
SELECT 2 
INTERSECT 
SELECT 3 

returns 1 en SQL Server (porque INTERSECT se realiza en primer lugar) y nothing en SQLite.)

La única solución parece ser la de usar las partes que desea combinar, en subconsultas , 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

no funciona, he editado mi pregunta original para reducir el problema. – user1425798