SQL多表JOIN查询报ERROR 1111无效使用聚合函数如何解决
错误原因
SUM()属于聚合函数,计算逻辑在分组操作之后执行,而WHERE子句的执行时机早于分组,无法读取聚合函数的计算结果,直接在WHERE中使用聚合函数做判断就会触发1111错误。- 额外说明:因为
examination_marks表以roll_number作为主键,每个学生仅对应一条成绩记录,你完全不需要使用SUM()做聚合计算,直接对三个科目成绩加总判断即可,这是你当前写法多余的部分。
修正方案
方案1(最简单,性能最优)
直接去掉多余的SUM(),把加总判断放在WHERE里即可,不需要分组聚合:
SELECT si.roll_number, si.name FROM student_information AS si INNER JOIN examination_marks AS em ON si.roll_number = em.roll_number WHERE (em.subject_one + em.subject_two + em.subject_three) < 100;
这里把LEFT OUTER JOIN改成INNER JOIN是因为需要过滤出有成绩记录的学生,没有成绩的学生不会出现在结果中,符合需求场景。如果确实需要保留左连逻辑也可以不改,无成绩的学生加总结果为NULL,不会满足小于100的条件,不会被返回。
方案2(多成绩记录聚合场景可参考)
如果后续业务调整为每个学生对应多条成绩记录需要求和,则需要先分组,再用HAVING子句过滤聚合结果:
SELECT si.roll_number, si.name FROM student_information AS si INNER JOIN examination_marks AS em ON si.roll_number = em.roll_number GROUP BY si.roll_number, si.name HAVING SUM(em.subject_one + em.subject_two + em.subject_three) < 100;
因为roll_number是两张表的主键,按si.roll_number分组即可唯一确定一个学生,部分严格的SQL模式要求SELECT里的非聚合字段都出现在GROUP BY中,所以这里把si.name也加入分组保证兼容性。
内容的提问来源于stack exchange,提问作者Pramodi Samaratunga
相关产品推荐
相关产品推荐

