You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:02:45