這是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語句中