Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi et quand un LEFT JOIN avec condition dans la clause WHERE n'est pas équivalent au même LEFT JOIN dans ON?

Le on La clause est utilisée lorsque le join recherche des lignes correspondantes. Le where La clause est utilisée pour filtrer les lignes une fois toutes les jointures effectuées.

Un exemple avec des toons Disney votant pour le président :

declare @candidates table (name varchar(50));
insert @candidates values 
    ('Obama'), 
    ('Romney');
declare @votes table (voter varchar(50), voted_for varchar(50));
insert @votes values 
    ('Mickey Mouse', 'Romney'),
    ('Donald Duck', 'Obama');

select  *
from    @candidates c
left join    
        @votes v
on      c.name = v.voted_for
        and v.voter = 'Donald Duck'

Cela renvoie toujours Romney même si Donald n'a pas voté pour lui. Si vous déplacez la condition de on à where clause :

select  *
from    @candidates c
left join    
        @votes v
on      c.name = v.voted_for
where   v.voter = 'Donald Duck'

Romney ne figurera plus dans le jeu de résultats.