Используя базу данных IMDB, у меня есть таблицы actor
, casts
и movie
, и мне нужно выбрать актеров с номером Кевина Бэкона 2. Я думал, что это должно это сделать, но я получаю Возвращено 0 строк. Какая у меня ошибка?
select fname, lname
from actor join casts on pid=actor.id
where actor.id in (
select a3.id --actors who have a kb number of 2
from casts c3 join actor a3 on c3.pid=a3.id,
(
(select c1.mid --actors who have a kb number of 1
from (casts c1 join actor a1 on c1.pid=a1.id), (casts c2 join actor a2 on c2.pid=a2.id)
where c1.mid=c2.mid and a2.fname='Kevin' and a2.lname='Bacon')
)Level1 where c3.mid=Level1.mid
)
and actor.id not in (select a4.id --and only a kb number of 2
from (casts c4 join actor a4 on c4.pid=a4.id), (casts c5 join actor a5 on c5.pid=a5.id)
where c4.mid=c5.mid and a5.fname='Kevin' and a5.lname='Bacon');
Вот схемы таблиц:
ACTOR (id, fname, lname, gender)
MOVIE (id, name, year)
CASTS (pid, mid, role)
mid
является внешним ключом для идентификатора фильма, а pid
является внешним ключом для идентификатора актера.
Обратите внимание, что ограничения по этому вопросу запрещают мне использовать временные таблицы или рекурсию: запрос должен выполняться с помощью подзапросов.
Я также пробовал
select count(distinct pid) from casts join actor on pid=actor.id where mid in (
select mid from casts where pid in (
select distinct pid from casts where mid in (
select mid from casts join actor on pid=actor.id where fname='Kevin' and lname='Bacon')))
and pid not in
(select distinct pid from casts where mid in (
select mid from casts join actor on pid=actor.id where fname='Kevin' and lname='Bacon'));
который также кажется, что он должен работать, но он не заканчивается.
Наконец-то мне удалось получить какой-то рабочий код:
select count(distinct pid) from casts where mid in (
select mid from casts where pid in (
select distinct pid from casts where mid in (
select mid from casts join actor on pid=actor.id where fname='Kevin' and lname='Bacon')))
and pid not in
(select distinct pid from casts where mid in (
select mid from casts join actor on pid=actor.id where fname='Kevin' and lname='Bacon'));
Подзапросы возвращают разумные ответы, по крайней мере. Но это происходит навсегда. Каждый подзапрос занимал менее 30 секунд, но вместе они берут 6 минут и подсчитывают. Почему?
Примечание: Это было дано мне как домашнее задание. Чтобы избежать какой-либо видимости академических проступков с моей стороны, я бы предпочел, чтобы люди не отправляли полные/точные решения, а скорее указывали на общие вещи, которые я делаю неправильно/высказываю общие предложения относительно того, как я должен это делать.