Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché e quando un LEFT JOIN con condizione nella clausola WHERE non è equivalente allo stesso LEFT JOIN in ON?

Il on La clausola viene utilizzata quando il join sta cercando righe corrispondenti. Il where La clausola viene utilizzata per filtrare le righe al termine di tutte le operazioni di unione.

Un esempio con i cartoni animati Disney che votano per la presidenza:

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'

Questo restituisce ancora Romney anche se Donald non ha votato per lui. Se sposti la condizione da on al where clausola:

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

Romney non sarà più nel set di risultati.