You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:03:27