Siempre he sabido sobre el UNIONoperador en SQL, pero solo recientemente descubrí que había otros operadores de conjuntos, INTERSECTy 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?
FULL JOINpuede 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.
(a EXCEPT b) UNION ALL (b EXCEPT a);Podría ser más eficiente.