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.