通过子查询找到第二高的薪水

时间:2019-03-17 10:55:54

标签: mysql sql

我有两个表员工和部门。

Employees表具有名称,薪水和部门编号。 部门表具有部门编号,部门名称

我必须使用子查询显示第二高的雇员(实际上是雇员表中每个雇员中唯一拥有第二高工资的雇员)及其部门名称

select 
    max(e.salary),
    d.department_name 
from oehr_employees e 
join oehr_departments d on(e.department_id = d.department_id) 
where e.salary not in(
    select max(salary) from oehr_employees
) 
group by department_name

试图做到这一点,但它仅显示每个部门的第二高薪水。不知道该怎么办:/

试图搜索答案,但没有完全得到我想要的。

4 个答案:

答案 0 :(得分:0)

如果只想再拿高一点的薪水,可以使用限制和补偿。

这不是一个有效的解决方案吗?

select e.salary,d.department_name 
from oehr_employees e 
join oehr_departments d on(e.department_id = d.department_id)
ORDER BY e.salary DESC LIMIT 1 OFFSET 1

答案 1 :(得分:0)

如果要使用子查询来执行此操作,可以尝试以下操作以获取薪水第二高的员工和部门的详细信息。

select e.name,e.salary,d.department_id,d.department_name
 from 
 oehr_employees e
 join oehr_departments d on e.department_id = d.department_id
 WHERE  e.salary IN (SELECT Max(salary) 
                  FROM   oehr_employees 
                  WHERE  salary NOT IN (SELECT Max(salary) 
                                        FROM   oehr_employees)); 

答案 2 :(得分:0)

使用ROW_NUMBER():

SELECT * 
FROM (
    SELECT 
        e.employee_id,
        d.department_id,
        e.salary,
        ROW_NUMBER() OVER(ORDER BY e.salary DESC) rn
    FROM oehr_employees e 
    INNER JOIN oehr_departments d 
        ON e.department_id = d.department_id
) x WHERE rn = 2

答案 3 :(得分:0)

我只需要稍微修改一下查询并添加limit 1

select e.*, d.department_name
from oehr_employees e join
     oehr_departments d
     on e.department_id = d.department_id)
where e.salary < (select max(e2.salary) from oehr_employees e2) 
order by e.salary desc
limit 1;

这似乎满足使用子查询的不可思议的要求。这是一种合理的方法。