这是SQL今日一题的第21篇文章ide
获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',
结果第一列给出员工的emp_no,
第二列给出其manager的manager_no,
第三列给出该员工当前的薪水emp_salary,
第四列给该员工对应的manager当前的薪水manager_salaryspa
用到dept_emp表、dept_manager表和salaries表
code
dept_emp表
dept_manager表
salaries表orm
select s_e.emp_no,
s_m.emp_no as manager_no,
s_e.salary as emp_salary,
s_m.salary as manager_salary
from
(
select de.emp_no,
de.dept_no,
s.salary
from dept_emp de
inner join salaries s on de.emp_no = s.emp_no
where de.emp_no not in
(
select emp_no from dept_manager
)
and s.to_date = '9999-01-01'
) as s_e,
(
select dm.emp_no,
dm.dept_no,
s.salary
from dept_manager dm
inner join salaries s on dm.emp_no = s.emp_no
where dm.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
) as s_m
where s_e.dept_no = s_m.dept_no
and s_e.salary > s_m.salary
这段SQL看着长,实际上是我为了方便理顺逻辑调整了下格式而已,别被吓到。
一、首先咱们要想知道员工薪水比manager薪水高的状况,就须要链接2个表,一个表是员工-薪水表,一个表是manager-薪水表,联立连个表之后,再将这两个表用联立,而后取员工-薪水表中的薪水大于manager-薪水表中薪水的值便可。blog
二、理顺思路咱们就来联立表。首先用inner join链接dept_emp和salaries表,以emp_no为公共字段,注意这样链接之后是全部员工的信息,那咱们要的是非manager员工的信息,因此里面再嵌套一个子查询,把manager员工的emp_no筛选出来,让链接的表的emp_no不等于manager的emp_no,获得的就是非manager员工的信息,别忘了给出where子句限制“当前”这个条件。查询出来的这个表命名为s_e
图片
三、再来用inner join链接dept_manager和salaries表,以emp_no为公共字段,where子句限制“当前”这个条件,结果命名为s_m。这个链接很简单。
ci
四、再将s_e和s_m链接起来,用where链接便可,公共字段为dept_no。同时给出另外一个限制条件:s_e.salary > s_m.salary。
it
结果class
子查询date
这题里嵌套了3个子查询
注意子查询的用法,能够做为过滤条件放在where后,能够做为临时表放在from后,也能够做为一个字段值放在select语句中