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语句中

相关文章
相关标签/搜索