Sempre soube do 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 grande operador de 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 fazendo um 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
Mas ambos parecem consultas bastante intensivas, especialmente em comparação com as outras três operações básicas de 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?
Todos os operadores de conjunto são convertidos em junções ou operadores semelhantes a junções. Você pode testemunhar isso no plano de consulta.
Por esse motivo, a junção externa completa que você tem é a mais eficiente que você pode fazer. Desconsiderando, é claro, a rara situação em que o otimizador escolhe um plano ruim e uma reescrita acontece para ter um desempenho melhor por sorte. Isso sempre pode acontecer.
Eu acho que esta é uma solução muito boa. Ele usa uma união entre dois selects com subconsultas Not Exists. Melhor do que combinar União e Exceto porque você pode incluir campos que não correspondem na projeção.