Para las INNER
uniones, no, el orden no importa. Las consultas devolverán los mismos resultados, siempre que cambie sus selecciones de SELECT *
a SELECT a.*, b.*, c.*
.
Para ( LEFT
, RIGHT
o FULL
) 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):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
es equivalente a :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
pero:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
no es equivalente a :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
Otro (con suerte más simple) ejemplo de asociatividad. Piense en esto como (a LEFT JOIN b) LEFT JOIN c
:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
Esto es equivalente a a LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
solo porque tenemos ON
condiciones "agradables" . Ambos ON b.ab_id = a.ab_id
y c.bc_id = b.bc_id
son controles de igualdad y no implican NULL
comparaciones.
Incluso puede tener condiciones con otros operadores o más complejos como: ON a.x <= b.x
o ON a.x = 7
o ON a.x LIKE b.x
o ON (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 como COALESCE()
, por ejemplo, si la condición era b.ab_id IS NULL
, entonces las dos consultas no serían equivalentes.
<blahblah>
? ¿Estás uniendo A a B y A a C, o estás uniendo A a B y B a C?