Ik ga dit uitleggen aan de hand van een equivalente "ANSI JOIN"-syntaxis:
Optie 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Optie 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Zoals u kunt zien, worden in optie 1 uw constante predikaten toegepast na de LEFT JOIN
tabeluitdrukking is opgegeven, d.w.z. op het resultaat van de LEFT JOIN
.
In optie 2 maakt een van uw constante predikaten deel uit van de LEFT JOIN
uitdrukking.
Hoe werkt LEFT JOIN
werk?
Het idee van een LEFT JOIN
is dat het alle rijen van LINKS . teruggeeft kant van de JOIN
expressie, ongeacht of er een overeenkomende rij aan de andere kant is, gegeven het join-predikaat. Dus in optie 2, ongeacht of u een rij vindt in CHK
met CURRENT = 'Y'
voor een rij in TXN
, de rij in TXN
wordt nog teruggestuurd. Dit is waarom je meer rijen krijgt in optie 2.
Dit voorbeeld zou ook moeten uitleggen waarom u de voorkeur zou moeten geven aan de syntaxis "ANSI JOIN". Vanuit het oogpunt van onderhoud / leesbaarheid is het veel duidelijker wat uw vraag doet.