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

¿Diferencia entre la notación más (+) de Oracle y la notación ansi JOIN?

AFAIK, el (+) La notación solo está presente para la compatibilidad con versiones anteriores porque Oracle la presentó antes de que se implementara el estándar ANSI para uniones. Es específico de Oracle y debe evitar usarlo en código nuevo cuando hay disponible una versión equivalente que cumple con los estándares.

Parece que hay diferencias entre los dos y el (+) La notación tiene restricciones que la sintaxis de combinación ANSI no tiene. Los propios Oracle recomiendan que no utilice el (+) notación. Descripción completa aquí en Oracle® Database SQL Language Reference11g Release 1 (11.1):

Oracle recomienda que utilice el FROM cláusula OUTER JOIN sintaxis en lugar del operador de unión de Oracle. Consultas de unión externa que usan el operador de unión de Oracle (+) están sujetos a las siguientes reglas y restricciones, que no se aplican a FROM cláusula OUTER JOIN sintaxis:

  • No puede especificar el (+) operador en un bloque de consulta que también contiene FROM sintaxis de unión de cláusulas.
  • El (+) El operador solo puede aparecer en WHERE cláusula o, en el contexto de la correlación a la izquierda (al especificar la TABLE cláusula) en el FROM y solo se puede aplicar a una columna de una tabla o vista.
  • Si A y B se unen mediante varias condiciones de unión, debe usar el (+) operador en todas estas condiciones. Si no lo hace, Oracle Database devolverá solo las filas resultantes de una combinación simple, pero sin una advertencia o error que le indique que no tiene los resultados de una combinación externa.
  • El (+) El operador no produce una combinación externa si especifica una tabla en la consulta externa y la otra tabla en una consulta interna.
  • No puede usar el (+) operador para unir externamente una tabla consigo misma, aunque las uniones automáticas son válidas.

Por ejemplo, la siguiente declaración no es válida:

SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;

Sin embargo, la siguiente unión automática es válida:

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
  • El (+) El operador solo se puede aplicar a una columna, no a una expresión arbitraria. Sin embargo, una expresión arbitraria puede contener una o más columnas marcadas con (+) operador.
  • Un WHERE condición que contiene el (+) el operador no se puede combinar con otra condición usando el OR operador lógico.
  • Un WHERE la condición no puede usar IN condición de comparación para comparar una columna marcada con (+) operador con una expresión.

Si el WHERE cláusula contiene una condición que compara una columna de la tabla B con una constante, entonces el (+) El operador debe aplicarse a la columna para que Oracle devuelva las filas de la tabla A para las que ha generado valores nulos para esta columna. De lo contrario, Oracle devuelve solo los resultados de una unión simple.

En una consulta que realiza uniones externas de más de dos pares de tablas, una sola tabla puede ser la tabla generada por valores nulos solo para otra tabla. Por este motivo, no puede aplicar el (+) operador a las columnas de B en la condición de combinación para A y B y la condición de combinación para B y C. Consulte SELECT para la sintaxis de una combinación externa.