J'ai toujours connu l' UNION
opérateur en SQL, mais je n'ai découvert que récemment qu'il y avait d'autres opérateurs d'ensemble, INTERSECT
et EXCEPT
. Je n'ai pas pu trouver d'opérateur qui fasse le quatrième grand opérateur d'ensemble, la différence symétrique (par exemple l'opposé de INTERSECT
.)
Il semble que je puisse obtenir la sortie souhaitée en utilisant quelque chose comme
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(en supposant que j'ai la priorité), ou en faisant une anti-jointure complète:
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
Mais les deux ressemblent à des requêtes assez intensives, en particulier par rapport aux trois autres opérations de base. Existe-t-il une opération de différence symétrique dans SQL et je ne la trouve tout simplement pas dans la documentation? Ou existe-t-il un moyen "canonique" de l'implémenter dans T-SQL?
FULL JOIN
pourrait être plus efficace. Les tests peuvent révéler ce qui est le mieux. Et bien sûr, si des colonnes supplémentaires / différentes de chaque table sont nécessaires, ma solution n'est pas facilement extensible.
(a EXCEPT b) UNION ALL (b EXCEPT a);
pourrait être plus efficace.