Siempre he sabido sobre el UNION
operador en SQL, pero solo recientemente descubrí que había otros operadores de conjuntos, INTERSECT
y EXCEPT
. No he podido encontrar un operador que haga el cuarto operador de conjunto grande, la diferencia simétrica (por ejemplo, lo opuesto a INTERSECT
).
Parece que puedo obtener el resultado deseado usando algo como
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(suponiendo que tengo la prioridad correcta), o haciendo un anti-full-join:
SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL
Pero ambas parecen consultas bastante intensivas, especialmente en comparación con las otras tres operaciones básicas de configuración. ¿Existe una operación de diferencia simétrica en SQL y simplemente no puedo encontrarla en la documentación? ¿O hay una forma "canónica" de implementarlo en T-SQL?
sql-server
t-sql
KutuluMike
fuente
fuente
(a EXCEPT b) UNION ALL (b EXCEPT a);
Podría ser más eficiente.FULL JOIN
puede ser más eficiente. Las pruebas pueden revelar cuál es el mejor. Y, por supuesto, si se necesitan más / diferentes columnas de cada tabla, mi solución no es fácilmente expandible.Respuestas:
Todos los operadores de conjunto se traducen en uniones u operadores similares. Puede presenciar eso en el plan de consulta.
Por esa razón, la combinación externa completa que tiene allí es la más eficiente que puede hacer. Sin tener en cuenta, por supuesto, la situación con suerte rara en la que el optimizador elige un mal plan y una reescritura tiene un mejor desempeño por suerte. Esto siempre puede suceder.
fuente
SELECT Id FROM A WHERE <stuff> EXCEPT Select Id FROM A WHERE <other stuff>
y obtener una sola lista deId
. No puedo entender cómo hacer eso con una unión completa ... ¿solo necesito lidiar con tener dos conjuntos deId
columnas y unirlas nuevamente?ISNULL(a.Col, b.Col) AS Col
. Envuelva eso en una tabla derivada o CTE y puede usar el conjunto de resultados "plegado" para una mayor operación en él. (Por cierto, estoy de acuerdo en que debería existir el operador de diferencia simétrica)Creo que esta es una muy buena solución. Utiliza una unión entre dos selecciones con subconsultas No existe. Mejor que combinar Unión y Excepto porque puede incluir campos que no coinciden en la proyección.
fuente