SQL Server查询各部门最低薪资员工语句结果错误求解决
问题原因
你编写的SQL逻辑错误出在内层的最低薪资查询没有按部门分组:
- 不带
GROUP BY DepID的前提下,select min(Salary) from Employee where DepID in (select distinct DepID from Employee)语句返回的是全表所有员工的最低薪资10000,而非每个部门各自的最低薪资,因此外层过滤后只有薪资为10000的John符合条件。 - 额外补充:你写的
where DepID in (select distinct DepID from Employee)条件属于多余逻辑,等价于没有过滤。
正确解法
解法1:关联子查询(兼容所有SQL版本)
SELECT ID, Name, Salary, DepID FROM Employee e1 WHERE Salary = ( SELECT MIN(Salary) FROM Employee e2 WHERE e2.DepID = e1.DepID )
这个写法会针对外层的每一条员工记录,匹配同部门的最低薪资,符合要求就会返回。如果同一个部门有多个薪资同为最低的员工,会全部返回。
解法2:窗口函数(SQL Server 2008及以上版本支持,执行效率更高)
WITH RankedEmp AS ( SELECT ID, Name, Salary, DepID, RANK() OVER(PARTITION BY DepID ORDER BY Salary ASC) AS SalaryRank FROM Employee ) SELECT ID, Name, Salary, DepID FROM RankedEmp WHERE SalaryRank = 1
用RANK()函数按部门分组后对薪资升序排名,排名为1的就是部门最低薪资的员工,同样支持同部门多个最低薪资的场景。
内容的提问来源于stack exchange,提问作者user15840105
相关产品推荐
相关产品推荐

