SQL多表JOIN查询选课数据时返回行数超预期的原因及解决方法
问题原因
行数异常膨胀是典型的关联条件缺失导致的笛卡尔积问题:
你当前关联Courses表时仅使用了secno作为关联条件,但secno并不是能唯一标识一条开课记录的字段——同一个序号的课程可能在不同学期开设、对应不同的课程编号,仅靠secno关联时,Enrolls表中的1条选课记录会匹配到Courses表中所有secno值相同的记录,最终返回行数自然会超过预期的6条。
换不同类型的JOIN、用UNION/交集操作没法解决问题的核心原因是:只要关联条件无法实现左表单条记录唯一匹配右表单条记录,不管用哪种JOIN逻辑,都会出现重复匹配,和JOIN类型无关。
修复方案
补全Enrolls和Courses的关联条件,覆盖能唯一确定开课记录的所有字段即可,修正后的查询语句如下:
SELECT s.sid, e.term, c.cno, e.secno, ca.ctitle FROM Students AS s JOIN Enrolls AS e ON s.sid = e.sid JOIN Courses AS c -- 补全term、cno关联条件,消除重复匹配 ON e.secno = c.secno AND e.term = c.term AND e.cno = c.cno JOIN Catalogue AS ca ON ca.cno = c.cno
排查小技巧
后续再遇到多表关联后行数超出预期的问题,可以按以下逻辑快速定位:
- 逐表核对关联条件,确认关联字段是否覆盖了被关联表的唯一主键/业务唯一键
- 可以从两表关联开始逐步加表,每加一个表就检查返回行数,加到哪个表出现行数暴涨,问题就出在这个表的关联条件上
内容的提问来源于stack exchange,提问作者CamronCollinsworth
相关产品推荐
相关产品推荐

