列出所有物种专业知识薪水最高的员工的员工详细信息

时间:2019-03-31 19:56:04

标签: mysql sql

问题是:

  

列出所有物种专业知识薪水最高的员工的员工详细信息

要使用Employee和V1表解决此问题(v1是使用employee表创建的视图)

https://imgur.com/a/chIFHmT:第一个表是员工,第二个表是V1

使用以下查询为我提供了所有正确的输出,它与75,000的Tiger薪水相匹配,而它只应显示90000的Tiger薪水。(它同时显示了两者)

预期结果:

 EmpNo  EmpName     Species     ZooName          Salary      Gender
 3008   Jill        Alligator   Whipsnade Park   40000.00      F
 3020   Red         Bear        Red Star         120000.00     M
 3004   Mary        Lion        Riverdale        110000.00     M
 3019   Alice       Panda       Pandaville       67000.00      F
 3013   May         Rhino       Boston City Zo   75000.00      F
 3006   Henrietta   Tiger       Whipsnade Park   90000.00      F

当前查询

select e.* 
from employee e 
join v1 on e.Species = v1.Species 
where e.Salary in (select salarymax from v1)

我在上面的查询中运行时得到的实际结果:

EmpNo   EmpName     Species     ZooName          Salary      Gender
3008    Jill        Alligator   Whipsnade Park   40000.00     F
3020    Red         Bear        Red Star         120000.00    M
3004    Mary        Lion        Riverdale        110000.00    M
3019    Alice       Panda       Pandaville       67000.00     F
3013    May         Rhino       Boston City Zoo  75000.00     F
3003    John        Tiger       Riverdale        75000.00     M   <-- Issue
3006    Henrietta   Tiger       Whipsnade Park   90000.00     F

1 个答案:

答案 0 :(得分:1)

您正在寻找一个薪金最高的员工。您只需使用NOT EXISTS条件和相关的子查询即可实现:

SELECT e.*
FROM employee e
WHERE NOT EXISTS (
    SELECT 1
    FROM employee e1
    WHERE e1.species = e.species AND e1.salary > e.salary
)

如果存在最高关系(即,如果多个雇员具有相同的给定物种的最高薪水),则将全部显示出来。

注意:使用v1视图并没有真正看到重点,所以没有。

从MySQL 8.0开始,窗口函数开始起作用,这可以通过更有效的方式解决:

SELECT *
FROM (
    SELECT e.*, RANK() OVER(PARTITION BY species ORDER BY salary DESC) rn
    FROM employee
) x WHERE rn = 1

如果您真的要使用v1,则需要更改JOIN条件。考虑:

SELECT e.* 
FROM employee e 
INNER JOIN join v1 on e.Species = v1.Species AND e.Salary = v1.salarymax