Vysvětlím to pomocí ekvivalentní syntaxe "ANSI JOIN":
Možnost 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Možnost 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Jak vidíte, u možnosti 1 se vaše konstantní predikáty použijí po LEFT JOIN je zadán tabulkový výraz, tj. na výsledku LEFT JOIN .
Ve volbě 2 je jeden z vašich konstantních predikátů součástí LEFT JOIN výraz.
Jak LEFT JOIN práce?
Myšlenka LEFT JOIN je, že vrátí všechny řádky z LEVA straně JOIN výraz, bez ohledu na to, zda je na druhé straně odpovídající řádek, daný predikátem spojení. Takže v možnosti 2, bez ohledu na to, jestli najdete řádek v CHK s CURRENT = 'Y' pro řádek v TXN , řádek v TXN se stále vrací. To je důvod, proč získáte více řádků v možnosti 2.
Tento příklad by měl také vysvětlit, proč byste měli preferovat syntaxi "ANSI JOIN". Z hlediska údržby/čitelnosti je mnohem jasnější, co váš dotaz dělá.