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

相關文章
相關標籤/搜索