Saltar al contenido

Unión externa izquierda usando + signo en Oracle 11g

Solución:

TableA LEFT OUTER JOIN TableB es equivalente a TableB RIGHT OUTER JOIN Table A.

En Oracle, (+) denota la tabla “opcional” en JOIN. Entonces, en su primera consulta, es un P LEFT OUTER JOIN S. En su segunda consulta, es S RIGHT OUTER JOIN P. Son funcionalmente equivalentes.

En la terminología, DERECHA o IZQUIERDA especifican qué lado de la combinación siempre tiene un registro y el otro lado puede ser nulo. Entonces en un P LEFT OUTER JOIN S, P siempre tendrá un registro porque está en el LEFT, pero S podría ser nulo.

Consulte este ejemplo de java2s.com para obtener una explicación adicional.


Para aclarar, supongo que estoy diciendo que la terminología no importa, ya que solo está ahí para ayudar a visualizar. Lo que importa es que comprenda el concepto de cómo funciona.


DERECHA vs IZQUIERDA

He visto cierta confusión sobre lo que importa al determinar DERECHA frente a IZQUIERDA en la sintaxis de unión implícita.

IZQUIERDA COMBINACIÓN EXTERNA

SELECT *
FROM A, B
WHERE A.column = B.column(+)

UNIÓN EXTERIOR DERECHA

SELECT *
FROM A, B
WHERE B.column(+) = A.column

Todo lo que hice fue cambiar los lados de los términos en la cláusula WHERE, pero siguen siendo funcionalmente equivalentes. (Consulte más arriba en mi respuesta para obtener más información al respecto). (+) determina DERECHA o IZQUIERDA. (Específicamente, si el (+) está a la derecha, es LEFT JOIN. Si (+) está a la izquierda, es un RIGHT JOIN.)


Tipos de JOIN

Los dos estilos de JOIN son UNIONES implícitas y JOIN explícitos. Son diferentes estilos de escritura JOIN, pero son funcionalmente equivalentes.

Vea esta pregunta SO.

JOIN implícitos simplemente enumere todas las tablas juntas. Las condiciones de unión se especifican en una cláusula WHERE.

JOIN implícito

SELECT *
FROM A, B
WHERE A.column = B.column(+)

JOIN explícitos asociar las condiciones de combinación con la inclusión de una tabla específica en lugar de en una cláusula WHERE.

JOIN explícito

SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column

Estos JOIN implícitos pueden ser más difíciles de leer y comprender, y también tienen algunas limitaciones, ya que las condiciones de combinación se mezclan en otras condiciones WHERE. Como tal, generalmente se recomiendan las JOIN implícitas en favor de la sintaxis explícita.

Esas dos consultas están realizando OUTER JOIN. Vea abajo

Oracle recomienda que utilice la sintaxis de la cláusula FROM OUTER JOIN en lugar del operador de combinación de Oracle. Las consultas de combinación externa que utilizan el operador de combinación de Oracle (+) están sujetas a las siguientes reglas y restricciones, que no se aplican a la sintaxis de la cláusula FROM OUTER JOIN:

  • No puede especificar el operador (+) en un bloque de consulta que también contiene la sintaxis de combinación de cláusula FROM.

  • El operador (+) puede aparecer solo en la cláusula WHERE o, en el contexto de correlación izquierda (cuando se especifica la cláusula TABLE) en la cláusula FROM, y solo se puede aplicar a una columna de una tabla o vista.

  • Si A y B están unidos por varias condiciones de combinació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 avise que no tiene los resultados de una combinación externa.

  • 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 una tabla a sí misma, aunque las uniones propias son válidas. Por ejemplo, la siguiente declaración no es válida:

    -- The following statement is not valid:
    SELECT employee_id, manager_id
       FROM employees
       WHERE employees.manager_id(+) = employees.employee_id;
    

    Sin embargo, la siguiente autounión 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
       ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;
    
  • El operador (+) se puede aplicar solo a una columna, no a una expresión arbitraria. Sin embargo, una expresión arbitraria puede contener una o más columnas marcadas con el operador (+).

  • Una condición WHERE que contiene el operador (+) no se puede combinar con otra condición usando el operador lógico OR.

  • Una condición WHERE no puede usar la condición de comparación IN para comparar una columna marcada con el operador (+) con una expresión.

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

En una consulta que realiza combinaciones externas de más de dos pares de tablas, una sola tabla puede ser la tabla generada por nulos solo para otra tabla. Por esta razón, 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 conocer la sintaxis de una combinación externa.

Tomado de http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm

Vi algunas contradicciones en las respuestas anteriores, solo intenté lo siguiente en Oracle 12c y lo siguiente es correcto:

IZQUIERDA COMBINACIÓN EXTERNA

SELECT *
FROM A, B
WHERE A.column = B.column(+)

UNIÓN EXTERIOR DERECHA

SELECT *
FROM A, B
WHERE B.column(+) = A.column
¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 1)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *