Jeg vil forklare dette ved at bruge tilsvarende "ANSI JOIN"-syntaks:
Mulighed 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Mulighed 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Som du kan se, i mulighed 1, anvendes dine konstante prædikater efter LEFT JOIN
tabeludtryk er angivet, dvs. på resultatet af LEFT JOIN
.
I mulighed 2 er et af dine konstante prædikater en del af LEFT JOIN
udtryk.
Hvordan gør LEFT JOIN
arbejde?
Ideen med en LEFT JOIN
er, at det vil returnere alle rækker fra VENSTRE siden af JOIN
udtryk, uanset om der er en matchende række på den anden side, givet join-prædikatet. Så i mulighed 2, uanset om du finder en række i CHK
med CURRENT = 'Y'
for en række i TXN
, rækken i TXN
er stadig returneret. Det er derfor, du får flere rækker i mulighed 2.
Dette eksempel skulle også forklare, hvorfor du bør foretrække "ANSI JOIN"-syntaksen. Fra et vedligeholdelses-/læsbarhedsperspektiv er det meget mere klart, hvad din forespørgsel gør.