Jag ska förklara detta genom att använda motsvarande "ANSI JOIN"-syntax:
Alternativ 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Alternativ 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 alternativ 1, tillämpas dina konstanta predikat efter LEFT JOIN
tabelluttryck specificeras, d.v.s. på resultatet av LEFT JOIN
.
I alternativ 2 är ett av dina konstanta predikat en del av LEFT JOIN
uttryck.
Hur går LEFT JOIN
jobba?
Idén med en LEFT JOIN
är att det kommer att returnera alla rader från VÄNSTER sidan av JOIN
uttryck, oavsett om det finns en matchande rad på andra sidan, givet join-predikatet. Så, i alternativ 2, oavsett om du hittar en rad i CHK
med CURRENT = 'Y'
för en rad i TXN
, raden i TXN
är fortfarande tillbaka. Det är därför du får fler rader i alternativ 2.
Detta exempel bör också förklara varför du bör föredra syntaxen "ANSI JOIN". Ur ett underhålls-/läsbarhetsperspektiv är det mycket tydligare vad din fråga gör.