首页 > 试题广场 >

获取员工其当前的薪水比其manager当前薪水还高的相关信息

[编程题]获取员工其当前的薪水比其manager当前薪水还高的相关信息
  • 热度指数:329081 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个,部门关系表dept_emp简况如下:
emp_no
dept_no 
from_date 
to_date
10001 d001
1986-06-26 9999-01-01
10002 d001
1996-08-03 9999-01-01

有一个部门经理表dept_manager简况如下:
dept_no 
emp_no
from_date 
to_date
d001
10002
1996-08-03 9999-01-01

有一个薪水表salaries简况如下:
emp_no 
salary
from_date 
to_date
10001
88958 2002-06-22
9999-01-01
10002
72527 1996-08-03
9999-01-01

获取员工其当前的薪水比其manager当前薪水还高的相关信息,
第一列给出员工的emp_no,
第二列给出其manager的manager_no,
第三列给出该员工当前的薪水emp_salary,
第四列给该员工对应的manager当前的薪水manager_salary
以上例子输出如下:
emp_no manager_no emp_salary manager_salary
10001 10002 88958 72527
示例1

输入

drop table if exists  `dept_emp` ; 
drop table if exists  `dept_manager` ; 
drop table if exists  `salaries` ; 
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','9999-01-01');

输出

10001|10002|88958|72527
select t1.emp_no,  t2.emp_no, t3.salary, t4.salary
from
(select emp_no, dept_no
from dept_emp
where emp_no not in  
(select emp_no
from dept_manager)
 ) as t1 left join dept_manager t2 on t1.dept_no = t2.dept_no
 left join salaries t3 on t1.emp_no = t3.emp_no
 left join salaries t4 on t2.emp_no = t4.emp_no
 where t3.salary > t4.salary

发表于 2022-09-01 16:57:42 回复(0)
select t1.emp_no, t1.manager_no, s.salary,  t1.manager_salary
from (
(select de.emp_no, dm.emp_no manager_no, s.salary manager_salary from dept_emp de
left join dept_manager dm
on de.dept_no=dm.dept_no
left join salaries s 
on s.emp_no=dm.emp_no
where de.emp_no not in (select emp_no from dept_manager)
) t1
) join salaries s
where s.emp_no=t1.emp_no and s.salary>t1.manager_salary






-- where
-- and de.emp_no not in (select emp_no from dept_manager)

发表于 2022-08-05 19:19:06 回复(0)
select a.emp1,b.emp2,s1,s2
from (
    select de.emp_no as emp1,dept_no,salary as s1
    from
    dept_emp de join salaries sa 
on de.emp_no=sa.emp_no

) a 
 left join (
    select d2.emp_no as emp2,dept_no,salary as s2
    from
    dept_manager d2 join salaries sa 
on d2.emp_no=sa.emp_no
)b
on a.dept_no=b.dept_no
where a.emp1<>b.emp2
and s1>s2

发表于 2022-06-28 11:28:27 回复(0)
with t_emp as
(select emp_no,dept_no,salary as emp_salary
from dept_emp
left join salaries using(emp_no)
where emp_no not in (select emp_no from dept_manager)
),
t_manager as 
(select emp_no as manager_no,dept_no,salary as manager_salary
 from dept_manager
 left join salaries using(emp_no)
)

select emp_no,manager_no,emp_salary,manager_salary
from t_emp
left join t_manager using(dept_no)
where emp_salary > manager_salary

发表于 2022-04-14 23:01:05 回复(0)
select distinct t1.emp_no, t2.emp_no manager_no, s.salary emp_salary, s1.salary manager_salary
from (select e.emp_no, e.dept_no
from dept_emp e
join dept_manager d
on e.emp_no not in (d.emp_no)) t1
join dept_manager t2
on t1.dept_no = t2.dept_no
join salaries s
on t1.emp_no = s.emp_no
join salaries s1
on t2.emp_no = s1.emp_no
where s.salary > s1.salary

有人赞一下我的做法吗?
发表于 2022-04-13 23:58:00 回复(0)
WITH T1 AS
(
SELECT dept_no, emp_no, salary
FROM salaries
JOIN dept_emp USING(emp_no)
WHERE dept_emp.to_date = '9999-01-01'
AND emp_no NOT IN (SELECT emp_no FROM dept_manager)
),
T2 AS
(
SELECT dept_no, emp_no, salary
FROM dept_manager
JOIN salaries USING(emp_no)
WHERE dept_manager.to_date = '9999-01-01'
)
SELECT T1.emp_no,
T2.emp_no AS manager_no,
T1.salary AS emp_salary,
T2.salary AS manager_salary
FROM T1
JOIN T2 USING(dept_no)
WHERE T1.salary > T2.salary;

发表于 2022-03-31 15:26:51 回复(0)
select
    t3.emp_no,
    t3.manager_no,
    t3.emp_salary,
    t3.manager_salary
from
    (
    (select
         de.emp_no,
         de.dept_no,
         s.salary as emp_salary
     from dept_emp de
     left join salaries s
     on de.emp_no = s.emp_no
    )t1
left join
    (select
         dm.emp_no as manager_no,
         dm.dept_no,
         s.salary as manager_salary
     from dept_manager dm
     left join salaries s
     on dm.emp_no = s.emp_no
    )t2
on t1.dept_no = t2.dept_no
    )t3
where emp_salary > manager_salary
发表于 2022-03-19 22:55:43 回复(0)
select de.emp_no,a.emp_no,s2.salary,a.salary from dept_emp de
left join 
(select dm.*,salary from dept_manager dm
left join salaries s 
on dm.emp_no = s.emp_no
where dm.to_date = s.to_date) a
on de.dept_no = a.dept_no
left join salaries s2
on de.emp_no = s2.emp_no and de.to_date = s2.to_date
where s2.salary>a.salary;
发表于 2022-03-18 16:24:36 回复(0)
SELECT d1.emp_no, d2.emp_no AS manager_no,
        s1.salary AS emp_salary,
        s2.salary AS manager_salary
FROM (
        (
        dept_emp d1 JOIN dept_manager d2
        ON d1.dept_no = d2.dept_no--获得经理与员工的对应关系
        )
JOIN salaries s1
ON d1.emp_no = s1.emp_no AND s1.to_date = '9999-01-01'--得到所有人的工资清单+经理与员工的对应关系
    )
JOIN salaries s2
ON d2.emp_no = s2.emp_no AND s2.to_date = '9999-01-01'  --得到经理工资清单+经理与员工的对应关系
WHERE s1.salary > s2.salary

发表于 2022-03-14 10:36:27 回复(0)
SELECT c.emp_no,a.emp_no manager_no,c.salary,a.salary manager_salary
    FROM 
    (dept_manager d_m 
    INNER JOIN salaries s  ON d_m.emp_no= s.emp_no) a --老板的薪资信息
    
    INNER JOIN
    (
        (SELECT * FROM dept_emp 
         WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager ))b
        INNER JOIN salaries s1 ON s1.emp_no = b.emp_no
    ) c                                              --员工的薪资信息
    ON a.dept_no=c.dept_no
    
    WHERE a.salary < c.salary
    AND a.to_date = '9999-01-01'

发表于 2022-03-12 17:44:48 回复(0)
a: 员工薪资
b: 管理薪资
然后作比较输出信息
with a as(
select  de.emp_no,sa.salary,de.dept_no
from dept_emp de
join salaries sa on de.emp_no  = sa.emp_no
where de.to_date='9999-01-01'
and sa.to_date = '9999-01-01'
and de.emp_no not in (select emp_no from dept_manager)),

b as(
select  dm.emp_no , sa.salary,dm.dept_no
from dept_manager dm 
join salaries sa on dm.emp_no  = sa.emp_no
where sa.to_date = '9999-01-01'
and dm.to_date = '9999-01-01')

SELECT a.emp_no,b.emp_no manager_no,a.salary emp_salary,b.salary manager_salary
from a join b on a.dept_no = b.dept_no
where a.salary > b.salary

发表于 2022-03-07 16:59:40 回复(0)
select a1.emp_no,a2.emp_no,a1.salary,a2.salary
from(select de.emp_no emp_no,de.dept_no dept_no,s1.salary salary
from dept_emp de
join salaries s1
on de.emp_no = s1.emp_no) a1
join(select dm.emp_no emp_no,dm.dept_no dept_no,s2.salary salary
from dept_manager dm
join salaries s2
on dm.emp_no = s2.emp_no
) a2
on a1.dept_no = a2.dept_no
where a1.salary>a2.salary

发表于 2022-02-27 08:45:11 回复(0)
select c.emp_no,d.emp_no as manager_no,
c.salary as emp_salary,d.salary as manager_salary
from (select a.emp_no,a.dept_no,b.salary from dept_emp a 
inner join salaries b 
on a.emp_no=b.emp_no
where a.emp_no not in 
(select emp_no from dept_manager))as c 
inner join
(select de.emp_no,de.dept_no,s.salary from dept_manager de 
          inner join salaries s 
          on de.emp_no=s.emp_no) d 
on c.dept_no=d.dept_no
where emp_salary>manager_salary
表dept_no和salaries连接得表A,(用where筛走非员工编号),获得员工编号和员工薪水,
表dept_manager 和salaries连接得表B,获得经理的员工编号和薪水。
将A和B内链接,连接条件是部门编号dept_no相同。
最后where 来限定员工薪水大于经理薪水

发表于 2022-02-23 09:47:06 回复(0)
select a2.emp_no,a1.manager_no,a2.emp_salary,a1.manager_salary
from
(select dm.emp_no as manager_no,dept_no,salary as manager_salary 
from dept_manager dm join salaries sa on dm.emp_no=sa.emp_no) a1
join
(select t.emp_no,dept_no,salary emp_salary
from (select dept_emp.emp_no,dept_no from dept_emp
     where dept_emp.emp_no not in(select dept_manager.emp_no from dept_manager)) t
     join salaries on t.emp_no=salaries.emp_no) a2
on a1.dept_no=a2.dept_no
where emp_salary>manager_salary
发表于 2022-01-08 22:25:41 回复(0)
#内连接 + 子查询
select s.emp_no , new.me , s.salary as emp_salary , new.ms as manager_salary
from salaries s
inner join dept_emp
on s.emp_no = dept_emp.emp_no
inner join 
(select dept_manager.dept_no dp,salaries.emp_no me, salary ms from
salaries inner join 
dept_manager 
on salaries.emp_no = dept_manager.emp_no) new
on dept_emp.dept_no = new.dp
where s.salary > new.ms

发表于 2022-01-01 22:47:51 回复(0)
SELECT
    *
FROM
    dept_emp;

SELECT
    *
FROM
    dept_manager;

SELECT
    *
FROM
    salaries;

-- emp_no | dept_no | from_date  |  to_date
----------+---------+------------+------------
--  10001 | d001    | 1986-06-26 | 9999-01-01
--  10002 | d001    | 1996-08-03 | 9999-01-01
--(2 rows)
--
-- dept_no | emp_no | from_date  |  to_date
-----------+--------+------------+------------
-- d001    |  10002 | 1996-08-03 | 9999-01-01
--(1 row)
--
-- emp_no | salary | from_date  |  to_date
----------+--------+------------+------------
--  10001 |  88958 | 2002-06-22 | 9999-01-01
--  10002 |  72527 | 1996-08-03 | 9999-01-01
--(2 rows)
;

SELECT
    de.emp_no AS empno,
    de.dept_no AS dept_no,
    dm.emp_no AS dm_no,
    sl.salary AS salary
FROM
    dept_emp AS de
    LEFT OUTER JOIN dept_manager AS dm ON dm.dept_no = de.dept_no
    LEFT OUTER JOIN salaries AS sl ON sl.emp_no = de.emp_no;

-- empno | dept_no | dm_no | salary
---------+---------+-------+--------
-- 10001 | d001    | 10002 |  88958
-- 10002 | d001    | 10002 |  72527
--(2 rows)
;

SELECT
    de.emp_no AS emp_no,
    de.dept_no AS dept_no,
    dm.emp_no AS dm_no,
    sl.salary AS salary,
    sl2.salary AS dm_sl
FROM
    dept_emp AS de
    LEFT OUTER JOIN dept_manager AS dm ON dm.dept_no = de.dept_no
    LEFT OUTER JOIN salaries AS sl ON sl.emp_no = de.emp_no,
    salaries AS sl2
WHERE
    sl2.emp_no = dm.emp_no;

-- emp_no | dept_no | dm_no | salary | dm_sl
----------+---------+-------+--------+-------
--  10001 | d001    | 10002 |  88958 | 72527
--  10002 | d001    | 10002 |  72527 | 72527
--(2 rows)
;

SELECT
    emp_no,
    dm_no,
    salary,
    dm_sl
FROM
    (
        SELECT
            de.emp_no AS emp_no,
            de.dept_no AS dept_no,
            dm.emp_no AS dm_no,
            sl.salary AS salary,
            sl2.salary AS dm_sl
        FROM
            dept_emp AS de
            LEFT OUTER JOIN dept_manager AS dm ON dm.dept_no = de.dept_no
            LEFT OUTER JOIN salaries AS sl ON sl.emp_no = de.emp_no,
            salaries AS sl2
        WHERE
            sl2.emp_no = dm.emp_no
    ) AS dmtb
WHERE
    salary > dm_sl;

-- emp_no | dm_no | salary | dm_sl
----------+-------+--------+-------
--  10001 | 10002 |  88958 | 72527
--(1 row)

发表于 2021-12-18 22:20:17 回复(0)
*1.员工和薪水表salaries相连 m1    2.经理和薪水表salaries相连 m2    3.两个新表连接,并且员工薪水高于部门经理
重点: AS 的使用
select m1.emp_no,m2.manager_no,m1.emp_salary,m2.manager_salary
from
    (select t.emp_no,s.salary as emp_salary,t.manager_no
    from (select e.emp_no,m.emp_no as manager_no
          from dept_emp e,dept_manager m
          where e.dept_no = m.dept_no) as t,salaries s
    where t.emp_no = s.emp_no) as m1,

    (select t2.*,s2.salary as manager_salary
    from (select e.emp_no,m.emp_no as manager_no
          from dept_emp e,dept_manager m
          where e.dept_no = m.dept_no) as t2 ,salaries s2
    where t2.manager_no = s2.emp_no) as m2
    
where m1.emp_no = m2.emp_no and m1.emp_salary > m2.manager_salary
发表于 2021-11-17 18:08:14 回复(0)

select d.emp_no, dm.emp_no as manager_no, s.salary,  ss.salary as manager_salaries from dept_emp d
join salaries s  on (s.emp_no = d.emp_no)
join dept_manager dm on(dm.dept_no = d.dept_no)
join salaries ss on(ss.emp_no = dm.emp_no)
where s.salary > ss.salary

发表于 2021-11-17 15:17:58 回复(0)
简单明了
select de.emp_no emp_no,dm.emp_no manager_no,s1.salary emp_salary,s2.salary manager_salary
from dept_emp de 
join dept_manager dm
on de.dept_no = dm.dept_no
join salaries s1 
on de.emp_no = s1.emp_no
join salaries s2
on dm.emp_no = s2.emp_no
where de.to_date = '9999-01-01'
and dm.to_date = '9999-01-01'
and s1.salary > s2.salary;
发表于 2021-09-29 15:18:37 回复(0)