Как перечислить все фильмы с участием Джеффа Голдблюма, но не Брюса Уиллиса? - PullRequest
0 голосов
/ 23 февраля 2020

В моей модели есть 3 таблицы: ACTORS , MOVIES и MOVIE_CAST , которые представляют отношения между ACTORS и MOVIES.

Таблица: ACTORS

  • Столбцы: имя, год рождения
  • Первичный ключ: имя, год рождения

Таблица: фильмы

  • Столбцы: Название, Release_Year, Жанр, Режиссер
  • Первичный ключ: Title, Release_Year

Таблица: MOVIE_CAST

  • Столбцы: Mov ie (FK), Movie_Release_Year (FK), Актер (FK), Birth_Yearh (FK)

Мне нужно указать название, год выпуска, жанр и режиссера всех фильмов с участием Джеффа Голдблюма 'но НЕ' Брюс Уиллис '.

Я пробовал запрос ниже, но он не работает. Он возвращает мне все фильмы, в которых снялся Джефф Голдблюм, включая те, которые он снял с Брюсом Уиллисом.

SELECT A.NAME, M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM ACTORS A
    JOIN MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
    JOIN MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE A.NAME = 'Jeff Goldblum' AND A.NAME != 'Bruce Willis'

Как мне написать запрос, чтобы вернуть мне фильмы, в которых Джефф Голдблюм снимался один или с другими актерами? кроме Брюса Уиллиса?

Ответы [ 3 ]

1 голос
/ 23 февраля 2020

Один из вариантов - агрегировать по mov ie (и его метаданным), а затем утверждать, что Джефф Голдблюм присутствует, а Брюс Уиллис не присутствует:

SELECT M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM ACTORS A
INNER JOIN MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
INNER JOIN MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
GROUP BY M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
HAVING
    COUNT(CASE WHEN A.NAME = 'Jeff Goldblum' THEN 1 END) > 0 AND  -- Goldblum appears
    COUNT(CASE WHEN A.NAME = 'Bruce Willis' THEN 1 END) = 0;      -- but not Willis
0 голосов
/ 23 февраля 2020

Я только что обнаружил оператор EXCEPT (который является оператором MINUS в зависимости от используемой базы данных).

Итак, мой запрос стал:

SELECT M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM   ACTORS A
    JOIN   MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
    JOIN   MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE  A.NAME = 'Jeff Goldblum' 

EXCEPT

SELECT M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM   ACTORS A
    JOIN   MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
    JOIN   MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE  A.NAME = 'Bruce Willis' 

И это сработало!

0 голосов
/ 23 февраля 2020

Вы можете использовать условие not exists, чтобы отфильтровать фильмы с Брюсом Уиллисом:

SELECT A.NAME, M.TITLE, M.RELEASE_YEAR, M.GENRE, M.DIRECTOR
FROM   ACTORS A
JOIN   MOVIE_CAST MC ON A.NAME = MC.ACTOR AND A.BIRTH_YEAR = MC.BIRTH_YEAR
JOIN   MOVIES M ON M.TITLE = MC.MOVIE AND M.RELEASE_YEAR = MC.MOVIE_RELEASE_YEAR
WHERE  A.NAME = 'Jeff Goldblum' AND
       NOT EXISTS (SELECT *
                   FROM   ACTORS b
                   WHERE  b.NAME = MC.ACTOR AND 
                          b.BIRTH_YEAR = MC.BIRTH_YEAR AND
                          b.NAME = 'Bruce Willis')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...