为何这段查询2004年电影关联人员的SQL语句无法正常运行?
排查2004年电影关联人员查询SQL的问题
问题原因
- 最内层子查询
SELECT id FROM movies WHERE year = 2004会返回多个电影ID(2004年上映的电影不止一部),而movie_id =只能匹配单个值,这会直接触发子查询返回多行的错误。 - 即便中间子查询只返回一个结果,
SELECT person_id FROM stars WHERE movie_id = ...也可能返回多个关联人员ID,id =同样无法处理多行匹配的场景。
修正方案
方案1:用IN替代=,适配子查询多行返回的情况
SELECT * FROM people WHERE id IN (SELECT person_id FROM stars WHERE movie_id IN (SELECT id FROM movies WHERE year = 2004)) ORDER BY birth;
方案2:使用JOIN语句,逻辑更清晰且性能更优
SELECT DISTINCT p.* FROM people p JOIN stars s ON p.id = s.person_id JOIN movies m ON s.movie_id = m.id WHERE m.year = 2004 ORDER BY p.birth;
注:DISTINCT用于避免同一人员因关联多部2004年电影而重复输出。
内容的提问来源于stack exchange,提问作者148 Yousof Islam Moheb
相关产品推荐
相关产品推荐

