Usando Two LEFT JOIN ou use AND com o único LEFT JOIN?


7

Usando dois LEFT JOINs

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
LEFT JOIN Table2 AS t3 ON <condition2>

é o mesmo que usar ANDem single LEFT JOIN? ie

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
AND <condition2>

Ambos são iguais ou diferentes (em geral)?


Depende da sua exigência e condição ON. Se você colocar t1.col1 = t2.col1 com Tabela2 e t1.col1.t3.col1, seria o mesmo.

2
A segunda consulta estaria mais próxima da primeira em termos de resultados se usasse OR em vez de AND, mas ainda assim seria uma consulta diferente em geral .
Andriy M

Tente usar Explique plano para ver a diferença :)
Arnab Datta

@RajeshRanjan não, eles não seriam equivalentes, mesmo nesse caso.
ypercubeᵀᴹ

Respostas:


13

Eles são diferentes. Na primeira opção, você recebe 2 vezes Table2em sua consulta. Uma vez como t2e uma vez como t3. Ambos têm um conteúdo diferente e você deve reuni-los de alguma forma. Para mim, isso é mais um OR em vez de um AND . Na segunda opção, você obtém apenas as Table2linhas que atendem aos dois critérios.

Suponha que você tenha Table2o seguinte conteúdo:

| Color | Size |
|-------|------|
| Red   |  S   |
| Blue  |  S   |
| Blue  |  XS  |

Suponha que você queira ter as linhas que são Bluee S. Na primeira opção, você obtém todas as linhas ( t2por exemplo, com todas Bluee t3com todas S) e na segunda opção, apenas a linha 2.


4
Não apenas isso, mas como se trata de unir duas vezes a tabela externamente, você também obterá um produto mini-cartesiano com a primeira consulta. Quero dizer, uma Table1linha quer a cor azul e o tamanho S. Portanto, a primeira junção fornece duas Table2correspondências, duplicando a Table1linha e a segunda junção fornece duas correspondências para cada uma das cópias, resultando em quatro linhas no total.
Andriy M
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.