Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle (+) junção externa e valores constantes


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.