这是SQL今日一题的第20篇文章ide
获取全部非manager员工当前的薪水状况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'spa
这题用到salaries表、dept_emp表、employees表和dept_manager表。其中dept_no、emp_no两个字段能够从dept_emp表中获得,salary字段从salaries表中获得,至于非manager员工这个条件则利用dept_manager表进行排除。
code
salaries表
dept_emp表
employees表
dept_manager表orm
select de.dept_no,de.emp_no,s.salary
from employees e
inner join salaries s on e.emp_no = s.emp_no and s.to_date = '9999-01-01'
inner join dept_emp de on e.emp_no = de.emp_no
where de.emp_no not in
(
select emp_no
from dept_manager
where to_date = '9999-01-01'
)
一、这道题涉及到4个表,思路就是将3个表链接起来,另外一个表做为过滤条件。blog
二、先把employees表和salaries表用emp_no这个公共字段链接在一块儿,而且给定限制条件to_date = '9999-01-01'。这一步操做是为了获取salary字段。图片
from employees e left join salaries s on e.emp_no = s.emp_no and s.to_date = '9999-01-01'ci
三、再把刚刚链接的表和dept_emp这个表链接在一块儿,公共字段仍是emp_no,这一步的操做是为了得到dept_no这个字段。it
left join dept_emp de on e.emp_no = de.emp_noclass
四、筛选出dept_manager表中的emp_no字段,让前3步取好的emp_no不等于dept_manager表中的emp_no,这样就获得了非manager员工的信息。注意理解题目,非magager员工,就是不在manager表里的员工。date
注意这题用inner join链接而非left join,注意这两个链接的区别,能够自行尝试一下,left join链接的结果以下,能够发现d005出现了2次。
left join
而用inner join链接的结果d005的10008那条没有salary记录的就没被选中。inner join