2014-12-21 4 views
0

Ниже копируются из высокопроизводительных тузда книги:Что следует за левым соединением sql statement?

select film.film_id from sakila.film 
left outer join sakila.film_actor using(film_id) 
where film_actor.film_id is null; 

Я не мог понять, что он делает. Делает ли фильтр предложения where для film_actor перед присоединением. Если да, то как выполняет соединение (film_id уже имеет нулевое значение, как он соединяется с пленкой с использованием film_id)

ответ

4

Это стандартный шаблон SQL для поиска родительских строк, у которых нет детей, в этом случае фильмы, которые не имеют актер.

Это работает, потому что пропущенные левые соединения имеют все нули в пропущенной объединенной строке, а предложение where оценивается после создания соединения. Указание столбца, который не может быть нулевым в действительности в объединенной строке, как null, возвращает только перепутанные соединения.

Обратите внимание, что вам не нужно distinct, потому что только одна такая строка возвращается для пропущенных объединений.

Смежные вопросы