Я так запутался с Outer Join 3 таблицы - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь сделать внешнее соединение трех таблиц.Моя база данных - база данных sakila.

Sakila Я пытаюсь получить строки с заголовками фильмов, которые никогда не сдавались.Итак, я присоединяюсь к трем таблицам следующим образом.

SELECT f.title
FROM film f
LEFT OUTER JOIN inventory i ON f.film_id = i.film_id
LEFT OUTER JOIN rental r ON i.inventory_id = r.inventory_id
WHERE r.rental_ID IS NULL;

Возвращает строку, но проблема в том, что я не знаю, правильный или неправильный запрос.Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы выбираете фильмы со стола фильмов.Вы - внешнее объединение запасов и арендных плат.Тогда вы сохраняете все NULL прокаты.Это так называемое анти-соединение, уловка, используемая на слабых СУБД для имитации предложений NOT EXISTS или NOT IN, что эти СУБД не справляются хорошо.

Таким образом, запрос дает вам все фильмы, которые либоне иметь товарно-материальных ценностей вообще или иметь товарно-материальные запасы, но ни одной арендыИли коротко: фильмы без проката.Точно, что вы говорите, что хотите достичь.

Другой способ написания запроса:

select title
from film f
where not exists
(
  select *
  from inventory i
  join rentals r on r.inventory_id = i.inventory_id
  where i.film_id = f.film_id
);
0 голосов
/ 24 сентября 2018

Я думаю, что вы должны использовать предложение EXISTS вместо этого, так как это позволяет подзапрос и проверить, возвращает ли строки или нет:

SELECT f.title
FROM film f
JOIN inventory i ON f.film_id = i.film_id
WHERE NOT EXISTS (
    SELECT 1
    FROM rental r 
    WHERE i.inventory_id = r.inventory_id
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...