SQLZOO多连接操作习题15:SQL查询结果异常求助
SQLZOO多连接操作第15题查询异常问题
问题现象
- 未添加
a.name <> 'Art Garfunkel'条件时,查询结果仅重复输出Art Garfunkel两次 - 添加该条件后,查询结果为空
原SQL代码
SELECT a.name FROM actor a INNER JOIN casting c ON a.id = c.actorid INNER JOIN movie m ON c.movieid = m.id WHERE m.id IN ( SELECT c.movieid FROM casting WHERE c.actorid IN ( SELECT a.id FROM actor WHERE a.name = 'Art Garfunkel' ) ) AND a.name <> 'Art Garfunkel'
习题表结构
- actor表:
id(演员ID)、name(演员姓名) - casting表:
movieid(电影ID)、actorid(演员ID)、ord(演员出演位次) - movie表:
id(电影ID)、title(电影名称)、yr(上映年份)、director(导演)、budget(制作预算)、gross(票房收入)
问题原因
原代码核心问题是子查询与外层查询的表别名冲突:
- 子查询里的
c和外层JOIN的casting表别名c重名,导致子查询中的c.movieid实际引用外层casting表数据,而非子查询自身的casting表 - 同理,子查询里的
a和外层actor表的别名a重名,导致内层演员ID查询逻辑完全错误
修正后的代码
方式一:给子查询表添加独立别名
SELECT a.name FROM actor a INNER JOIN casting c ON a.id = c.actorid INNER JOIN movie m ON c.movieid = m.id WHERE m.id IN ( SELECT c_inner.movieid FROM casting c_inner WHERE c_inner.actorid = ( SELECT a_inner.id FROM actor a_inner WHERE a_inner.name = 'Art Garfunkel' ) ) AND a.name <> 'Art Garfunkel'
方式二:改用多JOIN关联(逻辑更清晰)
SELECT co_actors.name FROM actor art JOIN casting art_cast ON art.id = art_cast.actorid JOIN casting co_cast ON art_cast.movieid = co_cast.movieid JOIN actor co_actors ON co_cast.actorid = co_actors.id WHERE art.name = 'Art Garfunkel' AND co_actors.name <> 'Art Garfunkel'
内容的提问来源于stack exchange,提问作者Miguens
相关产品推荐
相关产品推荐

