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á.