android开发实战 NTFS权限 package unix mvvm drupal layer jaxb jScrollPane vue组件注册 vuejs视频教程 ppt视频教程下载 纯html网页模板 python中的for循环 python自学入门 python正则匹配数字 java代码注释 java抛出自定义异常 java中的map html实例教程 图吧导航怎么样 真实女友补丁 vbscript程序员参考手册 机械下载 微信签名一句话至自己 亚索刀光 小程序开发工具下载 批量插入数据 cdlinux教程 拍照姿势的摆法女 pr抠图 非凡资源搜索器 ps怎么做漂亮艺术字 mysql数据库恢复 h5支付接口 劳动节称号 linux解压文件 dnf女柔道加点 kindeditor漏洞 baidupan
当前位置: 首页 > 学习教程  > 编程语言

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

2020/12/5 11:01:18 文章标签:

题目 解答 自写代码: select d.dept_no, d.emp_no, s.salary from dept_emp as d inner join salaries as s on d.emp_nos.emp_no where d.to_date9999-01-01’ and s.to_date9999-01-01 group by d.dept_no having salarymax(s.salary);错误点1:d.emp…

题目

在这里插入图片描述

解答

自写代码:

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)实际上是想筛选分组中的记录。这是错误的。
正确答案:关联子查询,外表固定一个部门,内表进行子查询

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;

本文链接: http://www.dtmao.cc/news_show_450379.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?