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