Ich werde dies erklären, indem ich die äquivalente "ANSI JOIN"-Syntax verwende:
Möglichkeit 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Option 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Wie Sie sehen können, werden Ihre konstanten Prädikate in Option 1 nach angewendet der LEFT JOIN
Tabellenausdruck angegeben ist, also auf das Ergebnis des LEFT JOIN
.
Bei Option 2 ist eines Ihrer konstanten Prädikate Teil des LEFT JOIN
Ausdruck.
Wie funktioniert LEFT JOIN
arbeiten?
Die Idee eines LEFT JOIN
ist, dass alle Zeilen von LINKS zurückgegeben werden Seite des JOIN
-Ausdruck, unabhängig davon, ob auf der anderen Seite eine übereinstimmende Zeile vorhanden ist, wenn das Join-Prädikat gegeben ist. Also, in Option 2, unabhängig davon, ob Sie eine Zeile in CHK
finden mit CURRENT = 'Y'
für eine Zeile in TXN
, die Zeile in TXN
wird noch zurückgegeben. Aus diesem Grund erhalten Sie in Option 2 mehr Zeilen.
Außerdem sollte dieses Beispiel erklären, warum Sie die "ANSI JOIN"-Syntax bevorzugen sollten. Aus Sicht der Wartung/Lesbarkeit ist es viel klarer, was Ihre Abfrage tut.