SQL JOIN操作报错求助:查询最低工资低于5000的部门数据
问题排查与解决方案
报错原因
WHERE 子句用于过滤单条原始数据行,不能直接使用MIN()这类聚合函数——聚合函数是对一组数据做统计计算的,必须配合GROUP BY完成分组后,在HAVING子句中使用来过滤分组结果。你在WHERE里调用min(e.salary),违反了SQL语法规则,因此触发"group function is not allowed here"错误。
正确SQL语句
写法1(先聚合再关联,效率更优)
先从员工表统计出最低工资低于5000的部门,再关联部门表获取完整部门数据:
SELECT d.* FROM hr.departments d INNER JOIN ( SELECT department_id, MIN(salary) AS min_salary FROM hr.employees GROUP BY department_id HAVING MIN(salary) < 5000 ) e_sal_stats ON d.department_id = e_sal_stats.department_id ORDER BY d.department_id;
写法2(关联后分组过滤)
直接关联两张表,按部门分组后用HAVING过滤最低工资符合条件的分组:
SELECT d.department_id, d.department_name, d.manager_id, d.location_id FROM hr.departments d LEFT JOIN hr.employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name, d.manager_id, d.location_id HAVING MIN(e.salary) < 5000 ORDER BY d.department_id;
注:如果存在无员工的部门,
MIN(e.salary)会返回NULL,由于NULL < 5000不成立,这类部门不会被纳入结果,符合业务逻辑。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

