Оптимальный запрос SQL для получения следующего набора результатов

Прежде всего, это домашнее задание.Я уже придумал и написал решение, но меня немного раздражает то, что я не могу успешно профилировать его или получить второе мнение относительно того, действительно ли оно хорошее.

Допустим, у меня есть простая таблица с информацией об участии в фильме (человек, фильм, отношение людей к фильму), например:

create table film
(
    person_name varchar(48) not null,
    film_title varchar(128) not null,
    relation varchar(48) not null
);

-- { 'Mel Gibson', 'Braveheart', 'director' }
-- { 'Mel Gibson', 'Braveheart', 'cast' }
-- { 'Steven Spielberg', 'A.I.' , 'director' }
-- { 'Hilary Swank', 'Million Dollar Baby', 'cast' }
-- etc

База данных и таблица не созданы и не поддерживаются мной, я просто запрашиваю информацию от него.

Мне нужно создать набор имен для режиссеров, которые снимаются (действуют перед камерой) в каждом фильме, который они сняли. Условие не должно не выполняться для людей, которые сняли хотя бы один фильм, в котором они не снимались, или для людей, которые ничего не сняли. Имеют ли эти режиссеры отношения с фильмами, которые они не снимали, здесь не имеет значения. По сути, запрос можно выразить так: «Дайте мне список людей, которые играли в каждом фильме, который они сняли».

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

(   
    select  person_name 
    from    film 
    where   relation = 'director'
)
except 
(
    select person_name
    from 
    (   
        (
            select  person_name, film_title 
            from    film 
            where   relation = 'director'
        ) 
        except 
        (   
            select  person_name, film_title 
            from    film 
            where   relation = 'cast'
        )
    ) as director_behind_camera_for_film
)

Я хотел бы знать, является ли запрос правильным, или я думал об этом совершенно неправильно? Если последнее, не могли бы вы предоставить мне лучшее решение или его объяснение?

Не обращайте особого внимания на тот факт, что я использую строки везде (там, где можно было использовать суррогатные ключи) - это упрощенный пример, но он все же демонстрирует мою проблему.

5
задан amn 2 October 2019 в 08:42
поделиться