Portanto, quero fazer uma junção à esquerda e fazer com que cada linha da tabela da esquerda inclua uma linha de nulos à direita, mesmo quando houver uma correspondência.
Existe um nome para esse tipo de associação?
E existe uma maneira melhor de fazer isso do que como faço abaixo (ou seja, algo evitando uma união)?
SELECT
T1.C1,
...
T1.CN
T2.C1,
...
T2.CM
FROM
Table1 T1
INNER JOIN Table2 T2
ON T1.Key1 = T2.Key1
UNION
SELECT
T1.C1,
...
T1.CN,
NULL, --NULL 1
...
NULL, --NULL M
FROM
Table1 T1
(Eu também poderia começar com uma junção à esquerda e, em seguida, unir um select como o segundo select acima filtrado apenas para as tabelas que possuem um ID correspondente, mas ainda é uma maneira complexa de fazer isso).
Eu queria saber se há algo como
SELECT
T1.C1,
...
T1.CN
T2.C1,
...
T2.CM
FROM
Table1 T1
INNER JOIN Table2 T2 INCLUDE_NULL_ROW_WITH_MATCH
ON T1.Key1 = T2.Key1
Isso é especificamente para o SQL Server 2008, se for relevante.
Eu vejo 3 maneiras de fazer isso, mas todas envolvem
UNION ALL
:sua versão`:
mudando ligeiramente a segunda parte:
primeiro a
UNION
, depois junte-se:Não acho que haverá muita diferença nos planos de execução e eficiência, mas o primeiro parece mais simples.
Aqui está outra opção que leva apenas uma única passagem pelos dados, realizando a junção à esquerda e, em seguida, para cada linha resultante, acrescentando a linha NULL, se necessário.
Se usarmos o script de teste a seguir, podemos ver que obtemos os resultados corretos e que o plano de execução passa uma única vez por #Table1 e #Table2. Pelo menos neste conjunto de dados de 10.000 linhas, o desempenho em termos de tempo de execução e IO é melhorado quando comparado com as soluções anteriores que foram apresentadas.
Aqui está o plano: