MySQL中实现给平均薪资最低部门涨薪10%的查询改写方案
解决MySQL给平均薪资最低部门员工涨薪的问题
针对你遇到的两个报错,这里提供两种可行的改写方案:
方案一:针对单个最低平均薪资部门
如果确定只有一个部门的平均薪资最低,可以用嵌套子查询只返回部门名称,避免多列匹配的问题:
UPDATE employees SET salary = salary * 1.10 -- 等价于 salary + 0.1*salary,写法更简洁 WHERE team = ( SELECT team FROM ( SELECT team, AVG(salary) avg_sal FROM employees GROUP BY team ORDER BY avg_sal LIMIT 1 ) AS lowest_team );
原理:内层子查询先筛选出平均薪资最低的部门(包含部门和平均薪资两列),外层子查询只提取部门列,这样主查询的WHERE team = ...就符合单值匹配的要求,同时嵌套结构绕过了LIMIT不能直接用于IN子查询的限制。
方案二:支持多个并列最低薪资部门
如果存在多个部门平均薪资相同且同为最低的情况,用以下写法可以一次性选中所有符合条件的部门:
UPDATE employees SET salary = salary * 1.10 WHERE team IN ( SELECT team FROM ( SELECT team FROM employees GROUP BY team HAVING AVG(salary) = ( SELECT MIN(avg_sal) FROM ( SELECT AVG(salary) avg_sal FROM employees GROUP BY team ) AS all_avg_sals ) ) AS lowest_teams );
原理:先通过最内层子查询算出所有部门的平均薪资,再取其中的最小值,接着找出所有平均薪资等于该最小值的部门,最后通过嵌套子查询让IN子句可以正常使用。
原查询报错原因说明
- 使用
=时报错:子查询返回了team和avg_sal两列,但=要求右侧子查询只能返回单个列,因此触发Operand should contain 1 column(s)错误。 - 改用
IN时报错:你的MySQL版本不支持在IN/ALL/ANY/SOME子查询中直接使用LIMIT,因此触发This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'错误。
内容的提问来源于stack exchange,提问作者Codistan
相关产品推荐
相关产品推荐

