SQL今日一题(20):4个表

这是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

相关文章
相关标签/搜索