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
INNERuniones, no, el orden no importa. Las consultas devolverán los mismos resultados, siempre que cambie sus selecciones deSELECT *aSELECT a.*, b.*, c.*.Para (
LEFT,RIGHToFULL)OUTERuniones, sí, el orden importa, y las cosas ( actualizadas ) son mucho más complicadas.Primero, las uniones externas no son conmutativas, por
a LEFT JOIN blo que no es lo mismo queb LEFT JOIN aLas 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
ONcondiciones "agradables" . AmbosON b.ab_id = a.ab_idyc.bc_id = b.bc_idson controles de igualdad y no implicanNULLcomparaciones.Incluso puede tener condiciones con otros operadores o más complejos como:
ON a.x <= b.xoON a.x = 7oON a.x LIKE b.xoON (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 NULLo 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 JOINy un siguienteLEFT JOIN. ¿Funciona así primero, la consulta se basará enFilterlos registrosINNER JOINy luego se aplicaráLEFT JOINa losFilteredregistros?ONclá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 TableBproducirá 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 TableBes diferente aTableB left Join TableA, PERO es lo mismo queTableB right Join TableAfuente
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