【问题标题】:How to get max salary in each dept from 2 tables - sql?如何从 2 个表中获取每个部门的最高薪水 - sql?
【发布时间】:2019-09-04 11:34:30
【问题描述】:

我有 2 张桌子,部门和员工。我需要获取每个部门最高薪水的员工姓名。

create table Dep(name_dep char, id_dep int);

insert into Dep values("econ", 1);
insert into Dep values("credit", 2);
insert into Dep values("energy", 3);
insert into Dep values("retail", 4);
insert into Dep values("manufactury", 5);

create table Emp(id_emp int, id_dep int, age int, person_name char, salary int );
insert into Emp values(1, 1, 23, 'john', 200);
insert into Emp values(3, 2, 3, 'dalbai', 100);
insert into Emp values(6, 3, 53, 'borat', 300);
insert into Emp values(7, 1, 63, 'erjan', 1600);
insert into Emp values(9, 2, 73, 'sergey', 1000);
insert into Emp values(8, 5, 83, 'lucy', 20);
insert into Emp values(90, 4, 93, 'mike', 1200);

如何查询各部门最高工资的员工姓名? 我的查询:

SELECT person_name, name_dep
FROM Emp e
INNER JOIN
(
    SELECT name_dep, MAX(salary) AS max_salary
    FROM Dep d
    GROUP BY id_dep
) d
    ON e.id_dep = d.id_dep

【问题讨论】:

  • 您的查询有什么问题?您是否错过了将max_salary 添加到SELECT 语句中的列?
  • @Sami,我不知道,我对整个查询感到困惑

标签: sql max inner-join


【解决方案1】:

加入表和返回每个部门最高薪水的查询:

select
  d.name_dep, e.person_name, t.salary
from Dep d inner join (
  select id_dep, max(salary) salary
  from Emp
  group by id_dep
) t on t.id_dep = d.id_dep
inner join Emp e on e.id_dep = t.id_dep and e.salary = t.salary

请参阅demo
结果:

| name_dep    | person_name | salary |
| ----------- | ----------- | ------ |
| energy      | borat       | 300    |
| econ        | erjan       | 1600   |
| credit      | sergey      | 1000   |
| manufactury | lucy        | 20     |
| retail      | mike        | 1200   |

【讨论】:

    【解决方案2】:

    虽然我已经纠正了 Gordon 的回答,但是如果您严格需要 ANCI 方法,您可以使用以下查询 -

    SELECT e.person_name, d.name_dep, d.max_salary
    FROM Emp e
    INNER JOIN Dep d ON e.id_dep = d.id_dep
    INNER JOIN (SELECT id_dep, MAX(salary) AS max_salary
                FROM Emp
                GROUP BY id_dep) d ON e.id_dep = d.id_dep
                                   AND e.salary = d.max_salary
    

    基本上您使用的是 name_dep 而不是我已更正的 id_dep。

    【讨论】:

    • 这不起作用。 Dep表中没有salary列。
    • Emp表中也没有列name_dep。谁赞成这个答案?
    • @forpas,更正了答案。如果还有其他问题,请告诉我。
    • @AnkitBajpai 是的,问题是您的回答是我回答的副本。
    • 嗯,你永远不会相信,但首先我更新了我的答案,然后我才看到你的答案并意识到你已经回答了。
    【解决方案3】:

    我有一个表,其工作方式与您的表几乎相同,在该表中我使用相关子查询

    select * from emp inner join dept on emp.deptno = dept.deptno where 
    (emp.deptno, sal) in 
    (select deptno, max(sal) from emp where deptno = emp.deptno 
    group by emp.deptno);
    

    相关查询获取更高的薪水和部门分组,然后,外部查询使用结果作为条件从表中提取信息,我喜欢它有帮助

    【讨论】:

      【解决方案4】:

      使用窗口函数。对于一个人,使用row_number()

      SELECT person_name, name_dep
      FROM (SELECT e.person_name, d.name_dep,
                   ROW_NUMBER() OVER (PARTITION BY e.id_dep ORDER BY e.salary DESC) as seqnum
            FROM Emp e INNER JOIN
                 Dep d
                 ON e.id_dep = d.id_dep
           ) ed
      WHERE seqnum = 1;
      

      如果您想在平局的情况下使用所有重复项,请使用RANK()

      【讨论】:

      • 谢谢你,我如何在不使用 seqnum 的情况下简化它?并订购?只是基本的内部连接
      • 没有我需要使用的最高薪水
      • 什么是c.salary? c 之前没有声明
      • @ERJAN,c.salary 实际上是 e.salary。我现在已经编辑了。无需使用 max 函数,因为 Window 函数 ROW_NUMBER 将代表 max(salary) 执行此操作。
      • @GordonLinoff,您总是非常受欢迎。如果可以的话,请与我分享一些 SQL 技术(特别是 ORACLE)。
      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 2021-03-04
      • 2021-03-15
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多