Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle (+) Outer Join und konstante Werte

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.