Verwenden Sie Two LEFT JOIN oder verwenden Sie AND mit Single LEFT JOIN?

7

Mit zwei LEFT JOINs dh

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

ist das dasselbe wie ANDbei Single LEFT JOIN? dh

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

Beide sind gleich oder unterschiedlich (im Allgemeinen)?

0x6773
quelle
Dies hängt von Ihrer Anforderung und dem EIN-Zustand ab. Wenn Sie t1.col1 = t2.col1 mit Table2 und t1.col1.t3.col1 setzen, wäre dies dasselbe.
2
Die zweite Abfrage wäre in Bezug auf die Ergebnisse näher an der ersten, wenn OR anstelle von AND verwendet würde, aber es wäre im Allgemeinen immer noch eine andere Abfrage .
Andriy M
Versuchen Sie, Plan erklären, um den Unterschied zu sehen :)
Arnab Datta
@ RajeshRanjan nein, sie wären auch in diesem Fall nicht gleichwertig.
Ypercubeᵀᴹ

Antworten:

13

Sie sind anders. Bei der ersten Option erhalten Sie 2 Mal Table2in Ihre Abfrage. Einmal als t2und einmal als t3. Beide haben unterschiedliche Inhalte und Sie müssen sie irgendwie wieder zusammenfügen. Für mich ist dies eher ein ODER als ein UND . In der zweiten Option erhalten Sie nur die Table2Zeilen, die beide Kriterien erfüllen.

Angenommen, Sie haben Table2folgenden Inhalt:

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

Angenommen, Sie möchten die Zeilen Blueund haben S. In Ihrer ersten Option erhalten Sie alle Zeilen ( t2zum Beispiel mit allen Blueund t3mit allen S) und in Ihrer zweiten Option erhalten Sie nur Zeile 2.

Marco
quelle
4
Darüber hinaus erhalten Sie bei der ersten Abfrage auch ein mini-kartesisches Produkt, da es darum geht, die Tabelle zweimal nach außen zu verbinden. Ich meine, eine Table1Zeile möchte die Farbe Blau und die Größe S. Der erste Join ergibt also zwei Table2Übereinstimmungen, wodurch die Table1Zeile dupliziert wird , und der zweite Join ergibt zwei Übereinstimmungen für jede der Kopien, was insgesamt vier Zeilen ergibt.
Andriy M