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.