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