Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle (+) jointure externe et valeurs constantes

Je vais expliquer cela en utilisant la syntaxe équivalente "ANSI JOIN":

Option 1

SELECT *
FROM TXN
LEFT JOIN CHK 
  ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'

Option 2

SELECT *
FROM TXN
LEFT JOIN CHK 
  ON TXN.CHK_ID = CHK.CHK_ID 
  AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'

Comme vous pouvez le voir, dans l'option 1, vos prédicats constants sont appliqués après le LEFT JOIN l'expression de table est spécifiée, c'est-à-dire sur le résultat du LEFT JOIN .

Dans l'option 2, l'un de vos prédicats constants fait partie du LEFT JOIN expression.

Comment fonctionne LEFT JOIN travailler ?

L'idée d'un LEFT JOIN est qu'il renverra toutes les lignes de la GAUCHE côté du JOIN expression, qu'il existe ou non une ligne correspondante de l'autre côté, étant donné le prédicat de jointure. Donc, dans l'option 2, peu importe si vous trouvez une ligne dans CHK avec CURRENT = 'Y' pour une ligne dans TXN , la ligne dans TXN est encore retourné. C'est pourquoi vous obtenez plus de lignes dans l'option 2.

De plus, cet exemple devrait expliquer pourquoi vous devriez préférer la syntaxe "ANSI JOIN". Du point de vue de la maintenance/lisibilité, il est beaucoup plus clair de savoir ce que fait votre requête.