sql >> Base de Datos >  >> RDS >> Oracle

Unión externa de Oracle (+) y valores constantes

Voy a explicar esto usando la sintaxis equivalente "ANSI JOIN":

Opción 1

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

Opción 2

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

Como puede ver, en la opción 1, sus predicados constantes se aplican después el LEFT JOIN se especifica la expresión de tabla, es decir, en el resultado de LEFT JOIN .

En la opción 2, uno de sus predicados constantes es parte de LEFT JOIN expresión.

¿Cómo LEFT JOIN trabajo?

La idea de un LEFT JOIN es que devolverá todas las filas desde la IZQUIERDA lado del JOIN expresión, independientemente de si hay una fila coincidente en el otro lado, dado el predicado de unión. Entonces, en la opción 2, independientemente de si encuentra una fila en CHK con CURRENT = 'Y' para una fila en TXN , la fila en TXN todavía se devuelve. Es por eso que obtienes más filas en la opción 2.

Además, este ejemplo debería explicar por qué debería preferir la sintaxis "ANSI JOIN". Desde una perspectiva de mantenimiento/legibilidad, es mucho más claro lo que está haciendo su consulta.