Прежде всего, это домашнее задание.Я уже придумал и написал решение, но меня немного раздражает то, что я не могу успешно профилировать его или получить второе мнение относительно того, действительно ли оно хорошее.
Допустим, у меня есть простая таблица с информацией об участии в фильме (человек, фильм, отношение людей к фильму), например:
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
)
Я хотел бы знать, является ли запрос правильным, или я думал об этом совершенно неправильно? Если последнее, не могли бы вы предоставить мне лучшее решение или его объяснение?
Не обращайте особого внимания на тот факт, что я использую строки везде (там, где можно было использовать суррогатные ключи) - это упрощенный пример, но он все же демонстрирует мою проблему.