3

查找当前薪水详情以及部门编号dept_no

http://www.nowcoder.com/questionTerminal/c63c5b54d86e4c6d880e4834bfd70c3b

题目:查找在当前时刻(to_date=‘9999-01-01’),各个部门的经理的薪水详情以及其对应部门编号dept_no
题目隐含要求:最后输出的emp_no是按照从小到大的顺序排列的

方法1:纯where连接两表
select salaries.emp_no, salaries.salary, salaries.from_date, salaries.to_date, dept_manager.dept_no
from dept_manager, salaries
where dept_manager.emp_no=salaries.emp_no
and dept_manager.to_date='9999-01-01'
and salaries.to_date='9999-01-01'
order by salaries.emp_no;
注意:这里order by后面的emp_no前必须有salaries.或者dept_manager.
注意:因为存在换部门,甚至离职的情况,所以dept_manager.to_date='9999-01-01’是必须的
或:( salaries.emp_no, salaries.salary, salaries.from_date, salaries.to_date是salaries表的所有字段,所以可以用salaries.代替)
select salaries.
, dept_manager.dept_no
from dept_manager, salaries
where dept_manager.emp_no=salaries.emp_no
and dept_manager.to_date='9999-01-01'
and salaries.to_date='9999-01-01'
order by emp_no;
注意:因为使用了salaries.(其中包含emp_no),所以order by后面的emp_no可以不加前缀
或:(给salaries和dept_manager起别名,下面提及它们的字段时,都可以简写)
select s.
, d.dept_no
from dept_manager d, salaries s
where d.emp_no=s.emp_no
and d.to_date='9999-01-01'
and s.to_date='9999-01-01'
order by emp_no;
补充:起别名的dept_manager as d中的as可以省略

方法2:用内连接
select s., d.dept_no
from dept_manager 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'
order by emp_no;

select s.
, d.dept_no
from salaries as s inner join dept_manager as d
on d.emp_no=s.emp_no
where d.to_date='9999-01-01'
and s.to_date='9999-01-01’;
补充:inner join中的inner可以省略,甚至inner join整个省略替换成,(逗号)也可以
注意:因为salaries表中emp_no是按照升序排列的,所以用salaries做主表就可以省略order by

全部评论
貌似你把问题处理的更加的复杂了,而且题没有告诉你当前日期就是9999-01-01
2 回复 分享
发布于 2021-10-12 14:21
salaries为主表不应该是左连接吗 salaries left join manager
2 回复 分享
发布于 2020-08-28 17:35
为什么要加最后的“where s.to_date='9999-01-01' and d.to_date='9999-01-01'”啊?一堆都添加这个条件的?题目也没写啊?
6 回复 分享
发布于 2021-09-15 12:16
select s., d.dept_no 这一句过不了,改为 select s.*,d.dept_no恢复正常,当然我是个新菜,综合多个回答才得出的结论
15 回复 分享
发布于 2020-12-02 15:27
为什么条件筛选的时候只是一个to_date='9999-01-01'不行,可以说明一下吗
2 回复 分享
发布于 2021-04-11 20:53
请问为啥不能用left join啊 select s.emp_no,salary,dept_no from ((select * from salaries where salaries.to_date='9999-01-01') as s) right join ((select * from dept_manager where dept_manager.to_date='9999-01-01') as d) on s.emp_no=d.emp_no order by s.emp_no 这样
2 回复 分享
发布于 2020-08-03 20:50
把省略写法也给补充上了,终于能看懂其他人写的简单版的语句了,感谢。
1 回复 分享
发布于 2021-04-02 18:49
你在干什么啊?这个跟to_date有什么关系?
点赞 回复 分享
发布于 2022-08-25 17:19 湖北
或:( salaries.emp_no, salaries.salary, salaries.from_date, salaries.to_date是salaries表的所有字段,所以可以用salaries.代替) ------------------------------------------------------------------我看见别人是写salaries.*的哦。并且这好像是sqlite的语法
点赞 回复 分享
发布于 2021-07-25 11:07
问题,如果是只是显示部门领导的薪资和领导的详细情况,这个时候问题出来了,领导的薪资是固定的,单一的。这个时候使用on会得到很多的垃圾数据的,需要进行过滤操作的。
点赞 回复 分享
发布于 2021-03-26 10:21

相关推荐

不愿透露姓名的神秘牛友
07-16 12:18
点赞 评论 收藏
分享
盖茨伯爵:一样兄弟,我从4月开始发到现在了,都三四百个了
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
155
12
分享

创作者周榜

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