12

获取所有部门中当前员工薪水最高的相关信息

http://www.nowcoder.com/questionTerminal/4a052e3e1df5435880d4353eb18a91c6

题目:获取所有部门中当前员工薪水最高的相关信息,给出dept_no,emp_no以及其对应的salary,当前表示to_date=‘9999-01-01'
隐含要求:按照部门升序排列

错误示范(虽然能通过测试,但实际上是错的)
SELECT d.dept_no, d.emp_no, s.salary
FROM dept_emp as d
INNER JOIN salaries as s
ON d.emp_no=s.emp_no
WHERE d.to_date='9999-01-01’
AND s.to_date='9999-01-01'
GROUP BY d.dept_no
HAVING salary=MAX(s.salary);
错误点1:d.emp_no是非聚合字段,不能出现在SELECT。因为一个聚合字段(dept_no)对应多个非聚合字段(emp_no),所以选择的时候,会随机选择非聚合字段中的任何一个,于是出错。
错误点2:根据错误点1,如果强行写上述代码,当多人同时拥有最高薪水时也无法查出。
错误点3:HAVING语句用来与聚合函数联合使用,过滤GROUP BY语句返回的记录集,筛选的是分组,例如HAVING AVG(score)>=80,筛选的是那些平均成绩大于80的分组,而上面的HAVING salary=MAX(s.salary)实际上是想筛选分组中的记录。这是错误的。

补充:
GROUP BY语句与HAVING语句的使用:参考资料:https://www.cnblogs.com/geogre123/p/11177204.html
语法:
SELECT column_1, column_2, … column_n, aggregate_function(expression), constant
FROM tables
WHERE predicates
GROUP BY column_1, column_2, … column_n
HAVING condition_1 … condition_n;
注意:因为聚合函数通过作用一组值而只返回一个单一值,因此,在SELECT语句中出现的字段要么为一个聚合函数的输入值,如COUNT(course),要么为GROUP BY语句中指定的字段,要么是常数,否则会出错。
简而言之:使用GROUP BY子句时,SELECT子句中只能有聚合键、聚合函数、常数。

正确答案:关联子查询,外表固定一个部门,内表进行子查询
SELECT d1.dept_no, d1.emp_no, s1.salary
FROM dept_emp as d1
INNER JOIN salaries as s1
ON d1.emp_no=s1.emp_no
AND d1.to_date='9999-01-01'
AND s1.to_date='9999-01-01'
WHERE s1.salary in (SELECT MAX(s2.salary)
FROM dept_emp as d2
INNER JOIN salaries as s2
ON d2.emp_no=s2.emp_no
AND d2.to_date='9999-01-01'
AND s2.to_date='9999-01-01'
AND d2.dept_no = d1.dept_no
)
ORDER BY d1.dept_no;

补充:如果这题不需要给出emp_no(即只求所有部门中当前员工薪水最高值),则用INNER JOIN和GROUP BY和MAX即可解决:
SELECT d.dept_no, MAX(s.salary)
FROM dept_emp as d
INNER JOIN salaries as s
ON d.emp_no=s.emp_no
AND d.to_date='9999-01-01'
AND s.to_date='9999-01-01'
GROUP BY d.dept_no;

全部评论
牛客网能过,navicat报错,> 1054 - Unknown column 'd1.dept_no' in 'on clause'
5 回复 分享
发布于 2020-12-11 10:42
11,12那个自以为是还骂人,having中的函数只能和普通数据比较,不能和字段比较,要和字段比较就要用表连接
4 回复 分享
发布于 2020-12-18 12:25
为什么 要限制date这个条件呢?
2 回复 分享
发布于 2021-10-08 10:05
我写的运行速度比你快
2 回复 分享
发布于 2020-09-26 21:51
你好 问一下隐含条件为什么是部门升序啊
2 回复 分享
发布于 2020-06-27 21:23
最后来了个ORDER BY d1.dept_no何解?
2 回复 分享
发布于 2020-05-26 23:20
SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp as d1 LEFT JOIN salaries as s1 ON d1.emp_no=s1.emp_no WHERE s1.salary = (SELECT MAX(s2.salary) FROM dept_emp as d2 LEFT JOIN salaries as s2 ON d2.emp_no=s2.emp_no where d2.dept_no = d1.dept_no ) ORDER BY d1.dept_no; 这样改就是
1 回复 分享
发布于 2022-07-19 14:21
多加一个部门就不行了
1 回复 分享
发布于 2021-08-27 17:16
也解决了有多个相同最高薪的情况,点赞
1 回复 分享
发布于 2021-07-02 11:34
为什么要写上日期的要求呀?
1 回复 分享
发布于 2021-06-04 10:14
求解,为什么这样写得出的结果有一点偏差 select dept_no,de.emp_no,max(salary) from dept_emp as de left join salaries as s on de.emp_no=s.emp_no group by dept_no order by dept_no;
1 回复 分享
发布于 2021-02-05 21:03
请问您一下 这一行 AND d2.dept_no = d1.dept_no 是什么意思啊 百思不得其解
26 回复 分享
发布于 2020-05-23 00:21
楼主思路没问题,只是写错了,子查询的最后一句应该是WHERE d2.dept_no = d1.dept_no,这一句的意思是,对主表中查出的每一个部门,子表要分别将这些部门作为条件进行查询。
21 回复 分享
发布于 2021-02-16 21:30
感觉这个也不对呀,虽然sql能通过,但是子查询里面查询出来的始终只是薪水的值,如果存在相同薪水的员工,那么这个sql可能就会不准确
20 回复 分享
发布于 2020-08-21 10:37
这个也不太对吧,子查询返回的是个值吧,没有部门之分了
12 回复 分享
发布于 2020-07-31 10:46
不要被悟道: GROUP BY 分组后形成一个虚拟表, #+------+---------+-------+ #| id | revenue | month | #+------+---------+-------+ #| | 6000 | Jan | #| 1 | 8000 | Feb | #| | 6000 | Mar | #+------+---------+-------+ #| 2 | 9000 | Jan | #+------+---------+-------+ #| 3 | 10000 | Feb | #+------+---------+-------+, 例如以上虚拟表,ID=1的组,d.emp_no选择显示是第一个6000而不是随机。而HAVING 将最大的那个赛选出来,则6000和7000被过滤掉。 错误点三 题意就是要选择分组后每个部门工资最高的员工所以HAVING salary=MAX(s.salary) 是对的,你题目意思都没搞清楚
点赞 回复 分享
发布于 2020-11-01 21:23
这个到底是要求所有部门里最高的,结果出来一条记录 还是每一个部门里最高的,每一个部门出来一个记录
7 回复 分享
发布于 2020-07-22 19:04
这个不行吧,子查询只是找出了每个组最高的薪水。如果:部门A的最高薪水为1000,部门B存在薪水为1000的员工,这样就会把B也给查出来
4 回复 分享
发布于 2021-09-26 04:29
运行环境:MYSQL 解题思路: 先查出各部门的最高薪酬,将该结果集与部门表和员工薪酬表关联查询,得出各部门的最高薪酬以及对应的员工信息。 select e.dept_no , e.emp_no , s.salary from dept_emp e , salaries s , (select e1.dept_no,max(s1.salary) salary from salaries s1 , dept_emp e1 where e1.emp_no = s1.emp_no group by e1.dept_no ) s2 where s.emp_no = e.emp_no and s2.dept_no = e.dept_no and s.salary = s2.salary order by e.dept_no
4 回复 分享
发布于 2021-06-17 23:17
感觉这个如果某个员工达到了非本部门的最高薪水而达到了其他部门的最高薪水也会被筛选出来,存在一定的逻辑错误
2 回复 分享
发布于 2024-07-27 20:10 北京

相关推荐

04-25 18:13
五邑大学 Java
后来123321:大二两段实习太厉害了,我现在大二连面试都没有
点赞 评论 收藏
分享
评论
509
46
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务