多表内连接查询无结果,拆分CTE却有数据?求原因分析
问题根源:笔误导致的条件冲突
嘿,我一眼就揪出你第一个查询里的坑了——是个容易疏忽的笔误,直接让连接条件完全冲突,所以才返回空结果!
看你第一个SQL里Y8的连接条件:
AND Y7.ClassId = 8 -- 这里写错了!
而在Y7的连接条件里,你已经明确限定了Y7.ClassId = 7——同一个Y7表的ClassId不可能同时等于7和8,这两个条件完全互斥,内连接根本找不到同时满足的记录,自然返回空集。
对比CTE写法的正确性
你的CTE版本能返回正确结果,核心是Y7和Y8是独立筛选的:
- Y7单独筛选出TermId=21、CampusId=1、ClassId=7的活跃男生
- Y8单独筛选出TermId=26、CampusId=7、ClassId=8的活跃男生
之后通过StudentId关联两个结果集,完全匹配你的业务需求,所以能得到59行数据。
修正第一个查询的方法
只需要把错误的Y7.ClassId = 8改成Y8.ClassId = 8即可,修正后的SQL如下:
SELECT S.FirstName, S.LastName, S.StudentId, Y8.SectionId FROM SR_Students AS S INNER JOIN SR_Student_Classes AS Y7 ON S.StudentId = Y7.StudentId AND S.IsActive = 1 AND S.Gender LIKE 'M%' AND Y7.TermId = 21 AND Y7.CampusId = 1 AND Y7.ClassId = 7 AND Y7.IsActive = 1 INNER JOIN SR_Student_Classes AS Y8 ON Y7.StudentId = Y8.StudentId AND Y8.TermId = 26 AND Y8.CampusId = 7 AND Y8.ClassId = 8 -- 修正为Y8.ClassId AND Y8.IsActive = 1
修改后这个查询会和CTE版本返回完全一致的结果。
另外你提到把联查条件移到WHERE子句也没用,这是因为不管这个错误条件放在ON还是WHERE里,都是要求Y7.ClassId同时等于7和8,冲突依然存在,所以还是不会返回任何数据。
内容的提问来源于stack exchange,提问作者Muhammad
相关产品推荐
相关产品推荐

