SQL Сервер - Сакила БД - PullRequest
       19

SQL Сервер - Сакила БД

0 голосов
/ 25 апреля 2020

Я сейчас использую MS Sakila DB, которая состоит из данных о фильмах / актерах / прокате / клиентах и ​​т. Д. c.

Карта:

Sakila Map

Меня попросили сформулировать запрос, чтобы найти клиентов, которые не арендовали определенный фильм.

Мне удалось разработать мой код для поиска клиентов, которые арендовали фильм, но я не могу разобраться, получая список, который не имеет.

Мой код ниже:

SELECT DISTINCT C.customer_id, C.first_name, C.last_name
FROM customer AS C
JOIN RENTAL AS R ON C.customer_id = R.customer_id
JOIN inventory AS I ON R.inventory_id = I.inventory_id
JOIN film AS F ON I.film_id = F.film_id
WHERE F.title = 'ANGELS LIFE'

Я могу использовать != 'ANGELS LIFE', но я получу список всех, кто снимал любой другой фильм (включая тех, которые снимали ANGELS LIFE от их другие покупки).

Я не могу решить следующий шаг. Я подумал об использовании Union и последующем удалении дубликатов (где count (*)> 1), возможно?

Цените любые советы.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Я бы порекомендовал not exists с коррелированным подзапросом. Это выглядит как простая и прямая формулировка того, что вы просили:

select c.*
from customer c
where not exists (
    select 1
    from rental r
    inner join inventory i on i.inventory_id = r.inventory_id
    inner join film f on f.film_id = i.film_id
    where f.title = 'ANGELS LIFE' and r.customer_id = c.customer_id
)
0 голосов
/ 25 апреля 2020

Вы можете использовать сделать агрегацию:

SELECT C.customer_id, C.first_name, C.last_name
FROM customer AS C JOIN 
     RENTAL AS R 
     ON C.customer_id = R.customer_id JOIN 
     inventory AS I 
     ON R.inventory_id = I.inventory_id JOIN 
     film AS F 
     ON I.film_id = F.film_id
GROUP BY C.customer_id, C.first_name, C.last_name
HAVING SUM(CASE WHEN F.title = 'ANGELS LIFE' THEN 1 ELSE 0 END) = 0;
...