SQL今日一題(21):3個子查詢

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

相關文章
相關標籤/搜索