Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle (+) outer join e valori costanti

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.