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.