(秋招SQL实战 :9.获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'
题目描述:
获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'
CREATE TABLE dept_manager
(
dept_no
char(4) NOT NULL,
emp_no
int(11) NOT NULL,
from_date
date NOT NULL,
to_date
date NOT NULL,
PRIMARY KEY (emp_no
,dept_no
));
CREATE TABLE salaries
(
emp_no
int(11) NOT NULL,
salary
int(11) NOT NULL,
from_date
date NOT NULL,
to_date
date NOT NULL,
PRIMARY KEY (emp_no
,from_date
));
输入描述:
无
输出描述:
emp_no | ||
---|---|---|
dept_no | emp_no | salary |
-------- | -------- | -------- |
d001 | 10002 | 72527 |
d004 | 10004 | 74057 |
d003 | 10005 | 94692 |
d002 | 10006 | 43311 |
d006 | 10010 | 94409 |
题目解析:
解法:
用左连接或者右连接查询,其实题目的意思是如果对应的部门经理有工资的话,就显示出来,没有的话,salary就置为空。
select d.dept_no,d.emp_no,s.salary
from dept_manager as d
left join salaries as s
on d.emp_no = s.emp_no
and s.to_date = '9999-01-01'
where d.to_date = '9999-01-01';
注:
先执行on语句筛选出所有部门经理的当前工资,其中d1.emp_no = s1.emp_no指的是在s1表里找到对应的部门经理的工资,但部门经理会有很多工资(会涨薪么),所以再添加一个s1.to_date = '9999-01-01'。
至于最后一个d1.to_date = '9999-01-01'是干什么的呢,left join会显示左表的所有数据,那么这个经理离职了也会显示出来(和前面的没有工资可不一样).