Vou explicar isso usando a sintaxe "ANSI JOIN" equivalente:
Opção 1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
Opção 2
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
AND CHK.CURRENT = 'Y'
WHERE TXN.CURRENT = 'Y'
Como você pode ver, na opção 1, seus predicados constantes são aplicados depois o
LEFT JOIN
expressão de tabela é especificada, ou seja, no resultado do LEFT JOIN
. Na opção 2, um de seus predicados constantes faz parte do
LEFT JOIN
expressão. Como LEFT JOIN
trabalha?
A ideia de um
LEFT JOIN
é que ele retornará todas as linhas da ESQUERDA lado do JOIN
expressão, independentemente de haver uma linha correspondente do outro lado, dado o predicado de junção. Portanto, na opção 2, independentemente de você encontrar uma linha em CHK
com CURRENT = 'Y'
para uma linha em TXN
, a linha em TXN
ainda é devolvido. É por isso que você obtém mais linhas na opção 2. Além disso, este exemplo deve explicar por que você deve preferir a sintaxe "ANSI JOIN". De uma perspectiva de manutenção/legibilidade, é muito mais claro o que sua consulta está fazendo.