¿Alguien puede decirme si las siguientes 2 consultas son un ejemplo de Unión externa izquierda o Unión externa derecha?
Table Part:
Name Null? Type
PART_ID NOT NULL VARCHAR2(4)
SUPPLIER_ID VARCHAR2(4)
PART_ID SUPPLIER_ID
P1 S1
P2 S2
P3
P4
Table Supplier:
Name Null? Type
SUPPLIER_ID NOT NULL VARCHAR2(4)
SUPPLIER_NAME NOT NULL VARCHAR2(20)
SUPPLIER_ID SUPPLIER_NAME
S1 Supplier#1
S2 Supplier#2
S3 Supplier#3
Mostrar todas las piezas independientemente de si algún proveedor las suministra o no:
SELECCIONE P.Part_Id, S.Proveedor_Name DESDE la Parte P, Proveedor S DONDE P.Supplier_Id = S.Supplier_Id (+) SELECCIONE P.Part_Id, S.Proveedor_Name DESDE la Parte P, Proveedor S DONDE S.Supplier_Id (+) = P.Supplier_Id
Respuestas:
TableA LEFT OUTER JOIN TableB
es equivalente aTableB RIGHT OUTER JOIN Table A
.En Oracle,
(+)
denota la tabla "opcional" en JOIN. Entonces, en su primera consulta, es unP LEFT OUTER JOIN S
. En su segunda consulta, esS RIGHT OUTER JOIN P
. Son funcionalmente equivalentes.En la terminología, RIGHT o LEFT especifican qué lado de la combinación siempre tiene un registro y el otro lado puede ser nulo. Entonces, en a
P LEFT OUTER JOIN S
,P
siempre tendrá un registro porque está enLEFT
, peroS
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 sobre eso). La ubicación de los
(+)
determina DERECHA o IZQUIERDA. (Específicamente, si(+)
está a la derecha, es LEFT JOIN. Si(+)
está a la izquierda, es RIGHT JOIN).Tipos de JOIN
Los dos estilos de JOIN son JOIN implícitos y JOIN explícitos . Son diferentes estilos de escribir JOIN, pero son funcionalmente equivalentes.
Vea esta pregunta SO .
Los JOIN implícitos simplemente enumeran 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(+)
Las JOIN explícitas asocian 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, las JOIN implícitas generalmente se recomiendan en favor de la sintaxis explícita.
fuente
JOIN
sintaxis idiomática en su lugar! Entonces no hay lugar para la confusión.FULL OUTER JOIN
sintaxis explícita , necesitaráUNION [ALL]
dos conjuntos de resultados juntos: uno para A = B (+) y otro para B = A (+). Ejemplo en esta pregunta .Estas dos consultas están funcionando
OUTER JOIN
. Vea abajoTomado de http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm
fuente
Vi algunas contradicciones en las respuestas anteriores, solo probé lo siguiente en Oracle 12c y lo siguiente es correcto:
SELECT * FROM A, B WHERE A.column = B.column(+)
SELECT * FROM A, B WHERE B.column(+) = A.column
fuente
IZQUIERDA COMBINACIÓN EXTERNA
SELECCIONE * DE A, B DONDE A.columna = B.columna (+)
UNIÓN EXTERIOR DERECHA
SELECCIONE * DE A, B DONDE A.columna (+) = B.columna
fuente
Hay información incorrecta en este hilo. Copié y pegué la información incorrecta:
¡Lo anterior es INCORRECTO! Es al revés. La forma en que determiné que es incorrecta es del siguiente libro:
Introducción a Oracle OCP a Oracle 9i: Guía de examen de SQL . La Tabla 3-1 tiene un buen resumen sobre esto. ¡No podía entender por qué mi SQL convertido no funcionaba correctamente hasta que fui a la vieja escuela y busqué en un libro impreso!
Aquí está el resumen de este libro, copiado línea por línea:
Sintaxis de unión externa de Oracle:
Equivalente a ANSI / ISO:
Observe aquí que es lo contrario de lo que se publicó anteriormente. Supongo que es posible que este libro tenga erratas, sin embargo confío en este libro más que en lo que está en este hilo. Es una guía de examen para llorar en voz alta ...
fuente
a.col_1(+) = b.col_1
coincidencia RIGHT JOIN, no LEFT JOIN.