SQL查询各部门讲师最高薪资结果错误的排查与修正咨询
解决查询各部门讲师最高薪资的SQL问题
首先咱们来拆解一下你原SQL语句的问题:
- Music部门缺失:因为Music部门只有Mozart一个讲师,找不到任何其他讲师S满足
T.salary > S.salary,所以这条记录根本不会被筛选出来。 - Finance和Physics部门结果错误:原逻辑是找存在薪资比自己低的讲师,但这并不能保证当前讲师是部门最高薪。比如Finance的Singh(80000),确实有比他薪资低的,但他不是部门最高;而真正的最高薪Wu(90000),找不到任何薪资比他高的讲师,所以
T.salary > S.salary对他来说没有匹配项,自然不会出现在结果里。同理Physics的Gold也不是最高薪,Einstein才是,但Einstein同样没有比他薪资高的,所以被排除了。
下面给你几种靠谱的修正方案:
方案1:使用窗口函数(最直观高效)
窗口函数可以轻松给每个部门的讲师按薪资排序,然后取每个部门的第一条记录:
SELECT Iname, dept_name FROM ( SELECT Iname, dept_name, ROW_NUMBER() OVER (PARTITION BY dept_name ORDER BY salary DESC) AS rn FROM instructor ) AS ranked_instructors WHERE rn = 1;
如果部门存在多个讲师薪资相同且都是最高的,想把他们都列出来,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。
方案2:子查询关联(兼容老版本SQL)
先找出每个部门的最高薪资,再关联讲师表获取对应讲师信息:
SELECT i.Iname, i.dept_name FROM instructor i JOIN ( SELECT dept_name, MAX(salary) AS max_sal FROM instructor GROUP BY dept_name ) AS dept_max ON i.dept_name = dept_max.dept_name AND i.salary = dept_max.max_sal;
方案3:使用NOT EXISTS(无聚合函数的写法)
找每个部门中不存在其他讲师薪资比自己高的记录:
SELECT T.Iname, T.dept_name FROM instructor T WHERE NOT EXISTS ( SELECT 1 FROM instructor S WHERE S.dept_name = T.dept_name AND S.salary > T.salary );
这三种方案都能得到你需要的正确结果:Comp. Sci.的Brandt、Finance的Wu、Music的Mozart、Physics的Einstein、History的Califieri、Biology的Crick、Elec. Eng.的Kim。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

