sql >> Databáze >  >> RDS >> Sqlserver

Proč a kdy LEFT JOIN s podmínkou v klauzuli WHERE není ekvivalentní stejnému LEFT JOIN v ON?

on klauzule se používá při join hledá odpovídající řádky. where klauzule se používá k filtrování řádků po dokončení veškerého spojení.

Příklad, kdy Disney Toons volí prezidenta:

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'

To stále vrací Romney i když Donald nehlasoval pro něj. Pokud podmínku přesunete z on do where klauzule:

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

Romney již nebude ve výsledkové sadě.



  1. Jak vybrat podřetězec v Oracle SQL až po konkrétní znak?

  2. Jak vypsat cizí klíče tabulky

  3. Jak TRIM() funguje v MariaDB

  4. Tabulky Postgresql existují, ale při dotazování neexistuje vztah získávání