Sin tener en cuenta el rendimiento, ¿obtendré el mismo resultado de la consulta A y B a continuación? ¿Qué tal C y D?
-- A
select *
from a left join b
on <blahblah>
left join c
on <blahblan>
-- B
select *
from a left join c
on <blahblah>
left join b
on <blahblan>
-- C
select *
from a join b
on <blahblah>
join c
on <blahblan>
-- D
select *
from a join c
on <blahblah>
join b
on <blahblan>
sql
join
relational-database
Solo un alumno
fuente
fuente
<blahblah>
? ¿Estás uniendo A a B y A a C, o estás uniendo A a B y B a C?Respuestas:
Para las
INNER
uniones, no, el orden no importa. Las consultas devolverán los mismos resultados, siempre que cambie sus selecciones deSELECT *
aSELECT a.*, b.*, c.*
.Para (
LEFT
,RIGHT
oFULL
)OUTER
uniones, sí, el orden importa, y las cosas ( actualizadas ) son mucho más complicadas.Primero, las uniones externas no son conmutativas, por
a LEFT JOIN b
lo que no es lo mismo queb LEFT JOIN a
Las uniones externas tampoco son asociativas, por lo que en sus ejemplos que involucran ambas propiedades (conmutatividad y asociatividad):
es equivalente a :
pero:
no es equivalente a :
Otro (con suerte más simple) ejemplo de asociatividad. Piense en esto como
(a LEFT JOIN b) LEFT JOIN c
:Esto es equivalente a
a LEFT JOIN (b LEFT JOIN c)
:solo porque tenemos
ON
condiciones "agradables" . AmbosON b.ab_id = a.ab_id
yc.bc_id = b.bc_id
son controles de igualdad y no implicanNULL
comparaciones.Incluso puede tener condiciones con otros operadores o más complejos como:
ON a.x <= b.x
oON a.x = 7
oON a.x LIKE b.x
oON (a.x, a.y) = (b.x, b.y)
y las dos consultas seguirían siendo equivalentes.Sin embargo, si alguno de estos está involucrado
IS NULL
o una función que está relacionada con valores nulos comoCOALESCE()
, por ejemplo, si la condición erab.ab_id IS NULL
, entonces las dos consultas no serían equivalentes.fuente
a.somecol > 0 OR b.someothercol > 0
; la asociatividad podría fallar para esa condición.INNER JOIN
y un siguienteLEFT JOIN
. ¿Funciona así primero, la consulta se basará enFilter
los registrosINNER JOIN
y luego se aplicaráLEFT JOIN
a losFiltered
registros?ON
cláusula (es decir, la "especificación de unión") a una nueva ubicación . Sin embargo, esto es solo sintaxis. Si utiliza la notación de álgebra relacional (donde la especificación de unión se coloca debajo del operador de unión), la asociatividad se vuelve más evidente. Su argumento solo muestra que las uniones externas no son conmutativas , lo cual es correctopara uniones regulares, no lo hace.
TableA join TableB
producirá el mismo plan de ejecución queTableB join TableA
(por lo que sus ejemplos C y D serían los mismos)para izquierda y derecha se une lo hace.
TableA left Join TableB
es diferente aTableB left Join TableA
, PERO es lo mismo queTableB right Join TableA
fuente
Si intenta unirse a C en un campo desde B antes de unirse a B, es decir:
su consulta fallará, por lo que en este caso el orden importa.
fuente
Oracle optimizer elige el orden de unión de las tablas para la unión interna. Optimizer elige el orden de unión de las tablas solo en simples cláusulas FROM. Puede consultar la documentación de Oracle en su sitio web. Y para la izquierda, la unión externa derecha, la respuesta más votada es la correcta. El optimizador elige el orden de unión óptimo, así como el índice óptimo para cada tabla. El orden de unión puede afectar qué índice es la mejor opción. El optimizador puede elegir un índice como la ruta de acceso para una tabla si es la tabla interna, pero no si es la tabla externa (y no hay más calificaciones).
El optimizador elige el orden de unión de las tablas solo en cláusulas FROM simples. La mayoría de las combinaciones que usan la palabra clave JOIN se aplanan en combinaciones simples, por lo que el optimizador elige su orden de combinación.
El optimizador no elige el orden de unión para las uniones externas; utiliza el orden especificado en la declaración.
Al seleccionar un orden de unión, el optimizador tiene en cuenta: El tamaño de cada tabla Los índices disponibles en cada tabla Si un índice en una tabla es útil en un orden de unión particular El número de filas y páginas a escanear para cada tabla en cada orden de unión
fuente