【问题标题】:Retrieve the names of employees who is making least in their departments检索在其部门中收入最少的员工的姓名
【发布时间】:2014-09-28 18:49:50
【问题描述】:

我有两张桌子

EMPLOYEE (Fname, Lname, Ssn, Salary, Dno)

DEPARTMENT (Dname, Dno, Location)

我想列出部门内所有收入最低的员工的姓名

我想出了这个

select min(E.Salary) from EMPLOYEE E group by E.Dno;

但是我如何加入 EMPLOYEE 表并显示“Fname”和“Lname”;

【问题讨论】:

  • 您需要一个对 SQL Server 和 Oracle 都有效的查询吗?
  • 您使用的是 Oracle 还是 SQL 服务器?如果两名员工在其部门的最低工资是什么预期结果?
  • 我想要一个适用于 Oracle 的查询。如果两名员工有最低工资,那么我想要这两名员工的姓名。

标签: sql oracle


【解决方案1】:

分析函数是最好的,但这也可以:

select *
  from employee e
 where salary = (select min(x.salary) from employee x where x.dno = e.dno)

【讨论】:

  • 每个部门都想要
  • @AmeyKellkar 将准确显示您想要的内容;每个部门中收入最低的员工。
  • 我在我的 Oracle 上试过了,是的,它给了我所需的准确输出。但是你能详细说明这是如何工作的吗?谢谢!
  • @AmeyKelkar 这是一个相关子查询,在员工表的每一行上,子查询将从表中找到该特定行上部门的最低工资金额(子查询每次选择一个新金额),如果当前行的工资与该表中同一部门的最低工资匹配,则该行返回,否则不返回
  • performance的角度来看,analytic function优于子查询的方式。
【解决方案2】:

使用Analytic 函数,ROW_NUMBER() OVER( PARTITION BY DNO ORDER BY SALARY) as RN。所以,WHERE RN = 1 会给你每个部门工资最低的员工。

请记住,如果有两个员工的薪水相同,那么您需要使用DENSE_RANK 来避免排名相似。

注意:此答案适用于 Oracle。

【讨论】:

  • 应该适用于 SQL Server - 至少 2012 年及以后 - 也是。
  • 不使用解析函数就没有办法了吗?
  • @Amey kelkar,有很多方法,但从performance 的角度来看,analytic function 更好。因为你scan 表只有一次。其余如图所示的其他方法效率不高。
  • @Joachim Isaksson,感谢您告诉我。我没有在 Sql Server 上工作过,所以我提出了免责声明 ;-)
【解决方案3】:

一种简单的方法是检查同一部门中没有工资较低的人;

SELECT e1.* 
FROM employee e1
WHERE NOT EXISTS(
  SELECT 1 FROM employee e2 WHERE e1.dno = e2.dno AND e1.salary > e2.salary
);

An SQLfiddle to test with.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2022-01-22
    • 2021-01-03
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多