Eu sempre soube sobre o UNION
operador no SQL, mas só recentemente descobri que havia outros operadores de conjunto INTERSECT
e EXCEPT
. Não consegui encontrar um operador que faça o quarto operador de grande conjunto, a diferença simétrica (por exemplo, o oposto de INTERSECT
.)
Parece que posso obter a saída desejada usando algo como
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(supondo que eu tenha a precedência correta) ou executando uma junção anti-completa:
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
Mas os dois parecem consultas bastante intensivas, especialmente em comparação com as outras três operações básicas do conjunto. Existe uma operação de diferença simétrica no SQL e simplesmente não consigo encontrá-la na documentação? Ou existe uma maneira "canônica" de implementá-lo no T-SQL?
FULL JOIN
pode ser mais eficiente. Os testes podem revelar qual é o melhor. E, claro, se forem necessárias mais / diferentes colunas de cada tabela, minha solução não será facilmente expansível.
(a EXCEPT b) UNION ALL (b EXCEPT a);
pode ser mais eficiente.