#sql #sqlite
#sql #sqlite
Вопрос:
SELECT name FROM people AS p
JOIN directors AS d ON d.person_id = p.id
JOIN stars AS s ON s.person_id = p.id
JOIN movies AS m ON m.id = d.movie_id
AND m.id = s.movie_id
WHERE m.title LIKE 'Toy Story%'
Я хочу написать SQL-запрос, чтобы перечислить имена всех людей, которые снимались в «Истории игрушек». И я получаю эту ошибку.
Execution finished with errors.
Result: interrupted
Таблицы:
movies (id INTEGER, title TEXT NOT NULL, year NUMERIC, PRIMARY KEY(id));
stars (movie_id INTEGER NOT NULL, person_id INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id), FOREIGN KEY(person_id) REFERENCES people(id));
directors (movie_id INTEGER NOT NULL, person_id INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id), FOREIGN KEY(person_id) REFERENCES people(id));
ratings (movie_id INTEGER NOT NULL, rating REAL NOT NULL, votes INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id));
people (id INTEGER, name TEXT NOT NULL, birth NUMERIC, PRIMARY KEY(id));
Комментарии:
1. Какую СУБД вы используете? Действительно ли нет других более подробных сообщений об ошибках?
2. @ADyson Я использую DB browser
3. Это звучит как какой-то инструмент клиентского интерфейса. Это вряд ли будет актуально. Я спросил, какую СУБД (т.Е. Механизм базы данных) Вы используете? например, MS SQL Server, MySQL, Oracle, SQLite, MariaDB … и т.д. (Вы всегда должны помечать свой вопрос этим, а также тегом «sql» в StackOverflow — руководство для тега SQL даже инструктирует вас сделать это — вы читали его, когда выбирали этот тег?)
4. вероятно, вы получаете ошибку здесь «И m.id = s.movie_id» , с помощью 1 join вы можете присоединиться к 2 таблицам, а не к 3, вам нужно снова присоединиться со звездами
5. @ADyson я не знаю. Но я использовал команду «sqlite3». Может быть, это как-то связано
Ответ №1:
Поскольку вы хотите перечислить как директоров, так и звезд (оба принадлежат лицам), вы должны получить имена директоров и звезд отдельно и объединить их. Примечание: используйте ОБЪЕДИНЕНИЕ, если вы хотите объединить повторяющиеся записи
SELECT name FROM people AS p
JOIN directors AS d ON d.person_id = p.id
JOIN movies AS m ON m.id = d.movie_id
WHERE m.title LIKE 'Toy Story%'
UNION ALL
SELECT name FROM people AS p
JOIN starts AS s ON s.person_id = p.id
JOIN movies AS m ON m.id = d.movie_id
WHERE m.title LIKE 'Toy Story%'