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

Hvorfor og hvornår en LEFT JOIN med betingelse i WHERE-klausulen ikke svarer til den samme LEFT JOIN i ON?

on klausul bruges, når join leder efter matchende rækker. hvor klausul bruges til at filtrere rækker, efter at al sammenføjning er udført.

Et eksempel med Disney-toner, der stemmer på 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'

Dette returnerer stadig Romney selvom Donald stemte ikke på ham. Hvis du flytter betingelsen fra on til hvor klausul:

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

Romney vil ikke længere være i resultatsættet.



  1. Konvertering mislykkedes ved konvertering af dato og/eller klokkeslæt fra tegnstreng, mens dato og klokkeslæt blev indsat

  2. Skal jeg bruge NOT IN, OUTER APPLY, LEFT OUTER JOIN, UNDTAGET eller IKKE FINDER?

  3. SQL WHERE-erklæring

  4. Tilføj et linket server-login i SQL Server (T-SQL-eksempel)