sql >> Base de Datos >  >> RDS >> Mysql

¿Condición INNER JOIN en la cláusula WHERE o en la cláusula ON?

Para uniones internas como esta, son lógicamente equivalentes. Sin embargo, puede encontrarse con situaciones en las que una condición en la cláusula de unión signifique algo diferente a una condición en la cláusula where.

Como una ilustración simple, imagina que haces una combinación izquierda como esta;

select x.id
from x
       left join y
         on x.id = y.id
;

Aquí estamos tomando todas las filas de x, independientemente de si hay una identificación coincidente en y. Ahora digamos que nuestra condición de combinación crece:no solo buscamos coincidencias en y en función del id, sino también de id_type.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Nuevamente, esto da todas las filas en x sin importar si hay una coincidencia (id, id_type) en y.

Sin embargo, esto es muy diferente:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

En esta situación, seleccionamos todas las filas de x e intentamos hacer coincidir las filas de y. Ahora, para las filas para las que no hay coincidencia en y, y.id_type será nulo. Por eso, y.id_type ='algún tipo' no está satisfecho, por lo que aquellas filas donde no hay coincidencias se descartan, lo que efectivamente convirtió esto en una unión interna.

Para resumir:para las uniones internas no importa adónde vayan las condiciones, pero para las uniones externas sí.