sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué y cuándo un LEFT JOIN con condición en la cláusula WHERE no es equivalente al mismo LEFT JOIN en ON?

El on La cláusula se usa cuando join está buscando filas coincidentes. El where La cláusula se utiliza para filtrar filas después de realizar todas las uniones.

Un ejemplo con dibujos animados de Disney votando por 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'

Esto todavía devuelve Romney aunque Donald no votó por él. Si mueve la condición de on al where cláusula:

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

Romney ya no estará en el conjunto de resultados.