Vous utilisez deux LEFT JOIN ou utilisez AND avec un seul LEFT JOIN?

7

Utilisation de deux LEFT JOINs ie

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

est-ce la même chose que d'utiliser ANDen single LEFT JOIN? c'est à dire

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

Les deux sont identiques ou différents (en général)?

0x6773
la source
Cela dépend de vos besoins et de votre condition. Si vous mettez t1.col1 = t2.col1 avec Table2 et t1.col1.t3.col1 Ce serait la même chose.
2
La deuxième requête serait plus proche de la première en termes de résultats si elle utilisait OR au lieu de AND, mais ce serait toujours une requête différente en général .
Andriy M
Essayez d'utiliser le plan Explain pour voir la différence :)
Arnab Datta
@RajeshRanjan non, ils ne seraient pas équivalents, même dans ce cas.
ypercubeᵀᴹ

Réponses:

13

Ils sont différents. Dans la première option, vous obtenez 2 fois Table2votre requête. Une fois comme t2et une fois comme t3. Les deux ont un contenu différent et vous devez les remettre ensemble. Pour moi, il s'agit plus d'un OU que d'un ET . Dans la deuxième option, vous obtenez uniquement les Table2lignes qui répondent aux deux critères.

Supposons que vous ayez Table2le contenu suivant:

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

Supposons que vous souhaitiez avoir les lignes qui sont Blueet S. Dans votre première option, vous obtenez toutes les lignes ( t2par exemple avec tous Blueet t3avec tous S) et dans votre deuxième option, vous obtenez uniquement la ligne 2.

Marco
la source
4
Non seulement cela, mais comme il s'agit de joindre deux fois la table à l'extérieur, vous obtiendrez également un produit mini-cartésien avec la première requête. Je veux dire, une Table1ligne veut la couleur bleue et la taille S. Donc, la première jointure lui donne deux Table2correspondances, dupliquant ainsi la Table1ligne, et la deuxième jointure donne deux correspondances pour chacune des copies, résultant ainsi en quatre lignes au total.
Andriy M