Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum und wann ist ein LEFT JOIN mit Bedingung in der WHERE-Klausel nicht mit demselben LEFT JOIN in ON äquivalent?

Der on -Klausel wird verwendet, wenn die join sucht nach übereinstimmenden Zeilen. Das where -Klausel wird verwendet, um Zeilen zu filtern, nachdem alle Verknüpfungen abgeschlossen sind.

Ein Beispiel mit Disney-Toons, die für den Präsidenten stimmen:

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'

Dies gibt immer noch Romney zurück obwohl Donald habe ihn nicht gewählt. Wenn Sie die Bedingung von on verschieben zum where Klausel:

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

Romney wird nicht mehr in der Ergebnismenge enthalten sein.