Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que e quando um LEFT JOIN com condição na cláusula WHERE não é equivalente ao mesmo LEFT JOIN em ON?


O on cláusula é usada quando o join está procurando por linhas correspondentes. O where A cláusula é usada para filtrar linhas depois que toda a junção é feita.

Um exemplo com desenhos da Disney votando para presidente:
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'

Isso ainda retorna Romney mesmo que Donald não votou nele. Se você mover a condição do on para o where cláusula:
select  *
from    @candidates c
left join    
        @votes v
on      c.name = v.voted_for
where   v.voter = 'Donald Duck'

Romney não estará mais no conjunto de resultados.