题解 | #获取每个部门中当前员工薪水最高的相关信息#

该博客讨论了在SQL中如何查询每个部门中薪水最高的员工信息。由于SQL在处理非聚合字段时的差异,例如MySQL会报错,而SQLite会随机选择非聚合字段。解决方法是通过两个子查询来匹配部门的最大薪资与对应员工。首先构造子表找到每个部门的最大薪资,然后在另一个子表中保留所有部门和薪资信息,最后通过连接这两个子表来获取正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题来源:
sql困难题:SQL12: 获取每个部门中当前员工薪水最高的相关信息

难点:解决并查集聚合过程中,sql需要select 非聚合列
解决思路:应用两张子表进行查询,一张为聚合列的聚合结果(不寒非聚合列),一张含有 聚合列的未聚合结果 和 非聚合列


***Mysql与Sqlite select 非聚合列***的结果是 不一样的,假使本题只要求输出:

dept_no,maxSalary两列,则只需使用max聚合函数:

select de.dept_no,max(sa.salary) as maxSalary
from dept_emp as de left join salaries as sa
on de.emp_no=sa.emp_no
group by de.dept_no
order by de.dept_no asc

但本体需要select emp_no这个非聚合字段,而一个聚合字段(dept_no)对应多个非聚合字段(emp_no),所以选择的时候,Sqlite会随机选择非聚合字段中的任何一个(而非选择max(sa.salary)最大工资对应的那一个emp_no),而mysql会直接报错!
这是select 非聚合字段,经典问题!!!

解决方法:
先构造一个子表t1(聚合同部门工资值),用于查找最大工资max(sa.salary) 与其dept_no,

(
    select de.dept_no,max(sa.salary) as salary
    from dept_emp as de left join salaries as sa
    on de.emp_no=sa.emp_no
    group by dept_no
) as t1

再构建一个子表t2(不聚和表中同部门的工资值,只合并两表),存储dept_no,salary(t2中的dept_no,salary用来和t1中的dept_no,salary比对),emp_no

(
    select de.dept_no,de.emp_no,sa.salary
    from dept_emp as de left join salaries as sa
    on de.emp_no=sa.emp_no
) as t2

t1,t2两子表联合查询:

select t2.dept_no,t2.emp_no,t1.salary as maxSalary from
(
    select de.dept_no,max(sa.salary) as salary
    from dept_emp as de left join salaries as sa
    on de.emp_no=sa.emp_no
    group by dept_no
) as t1 left join
(
    select de.dept_no,de.emp_no,sa.salary
    from dept_emp as de left join salaries as sa
    on de.emp_no=sa.emp_no
) as t2
on t1.dept_no=t2.dept_no and t1.salary=t2.salary
order by t2.dept_no asc

alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值