all sql join relational-database

union all sql server group by



¿La orden de unión importa en SQL? (3)

Para las uniones INNER , no, el orden no importa. Las consultas devolverán los mismos resultados, siempre y cuando cambie sus selecciones de SELECT * a SELECT a.*, b.*, c.* .

Para ( LEFT , RIGHT o FULL ), OUTER une, sí, importa el orden, y las cosas ( actualizadas ) son mucho más complicadas.

En primer lugar, las uniones externas no son conmutativas, por lo que a LEFT JOIN b no es lo mismo que b LEFT JOIN a

Las uniones externas tampoco son asociativas, por lo que en los ejemplos que implican 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 ejemplo de asociatividad (afortunadamente más simple). 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 condiciones de "buen" ON . Ambos ON b.ab_id = a.ab_id y c.bc_id = b.bc_id son verificaciones de igualdad y no implican comparaciones NULL .

Incluso puede tener condiciones con otros operadores o más complejos como: ON ax <= bx o ON ax = 7 u ON ax LIKE bx o ON (ax, ay) = (bx, by) y las dos consultas seguirán siendo equivalentes .

Sin embargo, si alguno de estos implicado IS NULL o una función que está relacionada con nulos como COALESCE() , por ejemplo, si la condición era b.ab_id IS NULL , entonces las dos consultas no serían equivalentes.

Sin tener en cuenta el rendimiento, ¿obtendré el mismo resultado de las consultas A y B a continuación? ¿Qué hay de 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>


Si intentas unir c en un campo de b antes de unir b, es decir:

SELECT a.x, a.y, a.z FROM a INNER JOIN c on b.x = c.x INNER JOIN b on a.x = b.x

su consulta fallará, por lo que en este caso importa el orden.


para uniones regulares, no es así. TableA join TableB producirá el mismo plan de ejecución que TableB join TableA (para que sus ejemplos C y D sean los mismos)

para las uniones izquierda y derecha, sí. TableA left Join TableB es diferente de TableB left Join TableA , PERO es lo mismo que TableB right Join TableA