SQL join: cláusula where vs. cláusula on

Después de leerlo, esto no es un duplicado de Explicit vs Implicit SQL Joins. La respuesta puede estar relacionada (o incluso ser la misma) pero la pregunta es diferente.


¿Cuál es la diferencia y qué debe ir en cada una?

Si entiendo bien la teoría, el optimizador de consultas debería poder utilizar ambos indistintamente.

Solución

No son lo mismo.

Considere estas consultas:

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345

y

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345

La primera devolverá un pedido y sus líneas, si las hay, para el número de pedido 12345. La segunda devolverá todos los pedidos, pero sólo el pedido 12345 tendrá alguna línea asociada.

Con un INNER JOIN, las cláusulas son efectivamente equivalentes. Sin embargo, el hecho de que sean funcionalmente iguales, es decir, que produzcan los mismos resultados, no significa que los dos tipos de cláusulas tengan el mismo significado semántico.

Comentarios (10)

En INNER JOINs son intercambiables, y el optimizador los reorganizará a voluntad.

En los OUTER JOINs, no son necesariamente intercambiables, dependiendo del lado de la unión del que dependan.

Yo los pongo en cualquiera de los dos lugares dependiendo de la legibilidad.

Comentarios (2)

En una unión interna, significan lo mismo. Sin embargo, obtendrá resultados diferentes en una unión externa dependiendo de si pone la condición de unión en la cláusula WHERE o en la cláusula ON. Echa un vistazo a esta pregunta relacionada y esta respuesta (por mí).

Creo que tiene más sentido tener el hábito de poner siempre la condición de unión en la cláusula ON (a menos que se trate de una unión externa y en realidad la quieras en la cláusula where), ya que hace más claro para cualquiera que lea tu consulta en qué condiciones se están uniendo las tablas, y también ayuda a evitar que la cláusula WHERE tenga docenas de líneas.

Comentarios (0)