Mysql
 sql >> Database >  >> RDS >> Mysql

Condizione INNER JOIN nella clausola WHERE o nella clausola ON?

Per inner join come questo sono logicamente equivalenti. Tuttavia, puoi imbatterti in situazioni in cui una condizione nella clausola join significa qualcosa di diverso da una condizione nella clausola where.

Come semplice illustrazione, immagina di eseguire un join sinistro in questo modo;

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

Qui prendiamo tutte le righe da x, indipendentemente dal fatto che ci sia un id corrispondente in y. Ora supponiamo che la nostra condizione di unione cresca:non stiamo solo cercando corrispondenze in y in base all'id ma anche su id_type.

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

Ancora una volta questo fornisce tutte le righe in x indipendentemente dal fatto che ci sia una corrispondenza (id, id_type) in y.

Questo è molto diverso, però:

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

In questa situazione, selezioniamo tutte le righe di x e proviamo a far corrispondere le righe di y. Ora per le righe per le quali non c'è corrispondenza in y, y.id_type sarà nullo. Per questo motivo, y.id_type ='qualche tipo' non è soddisfatto, quindi quelle righe in cui non c'è corrispondenza vengono scartate, il che ha effettivamente trasformato questo in un inner join.

Per farla breve:per le giunzioni interne non importa dove vanno le condizioni, ma per le giunzioni esterne può farlo.