Как написать несколько «JOIN» и «ON» в SQL

#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%'