SQL Server查询各部门最高薪资员工报错,求解决方法
问题原因与解决方法
问题根源
你使用的数据库(大概率是SQL Server)不支持(列1, 列2) IN (子查询)这种多列组合IN的语法。这种写法在MySQL、PostgreSQL等数据库中可以正常运行,但SQL Server无法识别这种多列条件的格式,因此抛出了"非布尔类型表达式用于条件上下文"的错误。
解决方向
提供三种通用的替代方案,适配绝大多数主流数据库:
方案1:使用JOIN关联子查询
通过JOIN将员工表与各部门最高薪资的统计结果关联,匹配部门名和薪资字段:
select e.* from employee e join ( select dept_name, max(salary) as HighestSalary from employee group by dept_name ) dept_max on e.dept_name = dept_max.dept_name and e.salary = dept_max.HighestSalary
方案2:使用EXISTS子查询
通过EXISTS检查当前员工的薪资是否等于其所在部门的最高薪资,兼容性最强:
select * from employee e where exists ( select 1 from employee e2 where e2.dept_name = e.dept_name group by e2.dept_name having max(e2.salary) = e.salary )
方案3:使用窗口函数(推荐)
如果你的数据库支持窗口函数(如SQL Server 2008+、MySQL 8.0+、PostgreSQL等),可以用ROW_NUMBER()或RANK()来筛选:
-- 若同部门有多个最高薪员工,仅保留一个(按默认排序) select * from ( select *, row_number() over(partition by dept_name order by salary desc) as rn from employee ) t where rn = 1
如果需要保留同部门所有薪资最高的员工,将row_number()替换为rank()即可:
select * from ( select *, rank() over(partition by dept_name order by salary desc) as rn from employee ) t where rn = 1
内容的提问来源于stack exchange,提问作者mykeerat
相关产品推荐
相关产品推荐

