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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:06:03