Lo spiegherò usando la sintassi "ANSI JOIN" equivalente:
Opzione 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Opzione 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Come puoi vedere, nell'opzione 1, i tuoi predicati costanti vengono applicati dopo il LEFT JOIN
l'espressione della tabella è specificata, cioè sul risultato del LEFT JOIN
.
Nell'opzione 2, uno dei tuoi predicati costanti fa parte di LEFT JOIN
espressione.
Come funziona LEFT JOIN
lavoro?
L'idea di un LEFT JOIN
è che restituirà tutte le righe da SINISTRA lato del JOIN
espressione, indipendentemente dal fatto che sia presente una riga corrispondente sull'altro lato, dato il predicato di join. Quindi, nell'opzione 2, indipendentemente dal fatto che trovi una riga in CHK
con CURRENT = 'Y'
per una riga in TXN
, la riga in TXN
è ancora restituito. Questo è il motivo per cui ottieni più righe nell'opzione 2.
Inoltre, questo esempio dovrebbe spiegare perché dovresti preferire la sintassi "ANSI JOIN". Dal punto di vista della manutenzione/leggibilità, è molto più chiaro cosa sta facendo la tua query.