首页 > 试题广场 >

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

[编程题]获取员工其当前的薪水比其manager当前薪水还高的相关信息
  • 热度指数:332763 时间限制: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
with t1 as
( --找出员工对应经理和员工薪水
select 
    d1.emp_no,
    d2.emp_no as manager_no,
    s.salary
from 
    dept_emp d1
left join dept_manager d2 on d1.dept_no = d2.dept_no
left join salaries s on s.emp_no = d1.emp_no
where 
    d1.emp_no != d2.emp_no
) --找出经理的薪水
select t1.emp_no,t1.manager_no,t1.salary,salaries.salary
from t1
join salaries on salaries.emp_no = t1.manager_no
where t1.salary > salaries.salary


发表于 2025-10-22 20:15:05 回复(0)
with t1 as (select 
distinct
x.emp_no
,x.dept_no
,first_value(salary) over(partition by x.emp_no order by y.to_date desc) as emp_salary
from dept_emp x 
join salaries y
using(emp_no)
),t2 as (
select 
distinct
x.emp_no as manager_no
,x.dept_no
,first_value(salary) over(partition by x.emp_no order by y.to_date desc) as manager_salary
from dept_manager x 
join salaries y
using(emp_no)
)
select emp_no,manager_no,emp_salary,manager_salary
from t1 
join t2 
on t1.dept_no=t2.dept_no and emp_salary>manager_salary

发表于 2025-10-15 12:03:40 回复(0)
select
    de.emp_no,
    dm.emp_no as manager_no,
    s1.salary as emp_salary,
    s2.salary as manager_salary
from dept_emp as de
    left join dept_manager as dm on de.dept_no = dm.dept_no
    inner join salaries as s1 on de.emp_no = s1.emp_no
    left join salaries as s2 on dm.emp_no = s2.emp_no
where
    s1.salary > s2.salary
order by
    de.emp_no;

发表于 2025-09-24 17:37:40 回复(0)
with emp_salaries as(
    select
    emp_no,
    salary emp_salary,
    dept_no
    from dept_emp a left join salaries b
    using(emp_no)
    where a.to_date="9999-01-01"
),manager_salaries as(
    select
    emp_no manager_no,
    salary manager_salary,
    dept_no
    from dept_manager a left join salaries b
    using(emp_no)
    where a.to_date="9999-01-01"
)
select
emp_no,manager_no,emp_salary,manager_salary
from
emp_salaries a inner join manager_salaries b
on a.dept_no=b.dept_no
and a.emp_salary>b.manager_salary
发表于 2025-09-16 10:14:00 回复(0)
一张表解决的思路
select
    s1.emp_no as emp_no,
    s2.emp_no as manager_no,
    s4.salary as emp_salary,
    s3.salary as manager_salary
from
    dept_emp s1
    left join dept_manager s2 on
    s1.dept_no = s2.dept_no and s2.to_date = '9999-01-01'
    left join salaries s3 on
    s2.emp_no = s3.emp_no and s3.to_date = '9999-01-01'
    left join salaries s4 on
    s1.emp_no = s4.emp_no and s4.to_date = '9999-01-01'
where
    s4.salary > s3.salary
    and s1.to_date = '9999-01-01'

发表于 2025-08-27 23:26:57 回复(0)
select emp.emp_no,m.manager_no,emp.emp_salary,m.manager_salary
from
(
select de.emp_no,de.dept_no,s.salary as emp_salary #添加部门关联
from dept_emp de join salaries s
on de.emp_no = s.emp_no
and s.to_date = '9999-01-01'
where de.to_date = '9999-01-01' #确保该员工仍在当前部门,没有离职
) as emp
join
(
select dm.emp_no as manager_no,dm.dept_no,s.salary as manager_salary
#添加部门关联
from dept_manager dm join salaries s
on dm.emp_no = s.emp_no
and s.to_date = '9999-01-01'
where dm.to_date = '9999-01-01' #确保该经理仍在当前部门,没有离职
) as m
on emp.dept_no = m.dept_no #连接条件--员工和经理同一个部门
where emp.emp_salary > m.manager_salary; #过滤条件
发表于 2025-08-12 15:32:49 回复(0)
select a.emp_no, b.emp_no as manager_no, c.salary as emp_salary, d.salary as manager_salary
from dept_emp a
join dept_manager b on a.dept_no = b.dept_no
join salaries c on a.emp_no = c.emp_no
join salaries d on b.emp_no = d.emp_no
where c.salary > d.salary 
    and a.to_date = "9999-01-01" 
    and b.to_date = "9999-01-01" 
    and c.to_date = "9999-01-01" 
    and d.to_date = "9999-01-01"

发表于 2025-08-01 13:01:16 回复(0)
select de.emp_no,
        dm.emp_no as manager_no,
        s1.salary as emp_salary,
        s2.salary as manager_salary
from dept_emp de
left join salaries s1
on de.emp_no = s1.emp_no
left join dept_manager dm
on de.dept_no=dm.dept_no
left join salaries s2
on dm.emp_no = s2.emp_no
where s1.salary > s2.salary and de.emp_no != dm.emp_no

发表于 2025-06-24 20:35:24 回复(0)
select
n.emp_no,
n.manger_no,
n.emp_salary,
n.manger_salary
from (
    select m.*,s1.salary as 'manger_salary'
    from (
        select t.*,d.emp_no as 'manger_no'
        from (
            select e.emp_no,e.dept_no,s.salary as 'emp_salary'
            from dept_emp e
            inner join salaries s
            on e.emp_no = s.emp_no
        ) t inner join dept_manager d
        on t.dept_no  = d.dept_no 
    ) m inner join salaries s1 on
    m.manger_no = s1.emp_no 
) n
where n.emp_no != n.manger_no 
and n.emp_salary > n.manger_salary


发表于 2025-06-21 17:31:13 回复(0)
主要关注的就是 分别获取 manager 的 salary 和 员工的 salary
select
    de.emp_no,dm.emp_no,sa.salary,sa2.salary
from 
    dept_emp            as de 
    join salaries       as sa  on sa.emp_no  = de.emp_no  -- 获取到了 普通员工的 salary
    join dept_manager   as dm  on dm.dept_no = de.dept_no
    join salaries       as sa2 on sa2.emp_no = dm.emp_no  -- 获取到了 manager的 salary
where 
    sa2.salary < sa.salary


发表于 2025-06-04 21:20:03 回复(0)
select aa.emp_no, bb.emp_no manager_no, aa.salary emp_salary, bb.salary manager_salary
from
(select a.emp_no, a.dept_no, s.salary from
(select dp.emp_no, dp.dept_no from
dept_emp dp left join dept_manager dm
on dp.emp_no = dm.emp_no
where dm.emp_no is null) a
left join salaries s
on a.emp_no = s.emp_no) aa
left join
#员工工资以及信息
(select b.emp_no, b.dept_no, s.salary from
(select dp.emp_no, dp.dept_no from
dept_emp dp left join dept_manager dm
on dp.emp_no = dm.emp_no
where dm.emp_no is not null) b
left join salaries s
on b.emp_no = s.emp_no) bb
#经理工资以及信息
on aa.dept_no = bb.dept_no
where aa.salary > bb.salary
发表于 2025-06-02 14:04:45 回复(0)
select s1.emp_no, s2.emp_no as manager_no,
       s1.salary as emp_salary,
       s2.salary as manager_salary
from  (select t1.emp_no, t1.dept_no, t1.manager_no, salary
       from
         (select de.emp_no, de.dept_no, dm.emp_no as manager_no
         from dept_emp de
         join dept_manager dm
         on de.dept_no=dm.dept_no
         where de.emp_no!=dm.emp_no
         and de.to_date='9999-01-01'
         and dm.to_date='9999-01-01'
         ) t1 #找出非manager的员工
       join salaries s
       on t1.emp_no=s.emp_no
       where s.to_date='9999-01-01'
       )s1 #员工薪水
join  (select t2.emp_no, salary
       from
         (select dm.emp_no
         from dept_emp de
          join dept_manager dm
         on de.dept_no=dm.dept_no
         where de.emp_no=dm.emp_no
         and de.to_date='9999-01-01'
         and dm.to_date='9999-01-01'
         ) t2 #找出manager
       join salaries s
       on t2.emp_no=s.emp_no
       where s.to_date='9999-01-01'
       )s2 #manager薪水
on s1.manager_no=s2.emp_no
where s1.salary>s2.salary
发表于 2025-04-12 22:51:53 回复(0)
select
    a.emp_no,
    s.emp_no as manager_no,
    d.salary as emp_salary,
    f.salary as manager_salary
from
    dept_emp as a,
    dept_manager as s,
    salaries as d,
    salaries as f
where
    a.dept_no = s.dept_no
    and a.emp_no = d.emp_no
    and s.emp_no = f.emp_no
    and d.salary > f.salary
就把工资表连接两次一次绑定员工的工资,一次绑定部门经理的工资再进行比较

发表于 2025-04-07 10:49:34 回复(0)
with k as
(select dept_no,a.emp_no manager_no,salary manager_salary from dept_manager a 
left join salaries b on a.emp_no = b.emp_no),
k1 as(
   select c.emp_no,manager_no,c.dept_no ,salary emp_salary,manager_salary from dept_emp c
   left join salaries d on d.emp_no = c.emp_no
   left join k on k.dept_no = c.dept_no )
select emp_no,manager_no,emp_salary,manager_salary from k1 where emp_salary>manager_salary

发表于 2025-04-02 13:33:15 回复(0)
select de.emp_no, q1.emp_no, s.salary emp_salary, q1.salary manager_salary
from dept_emp de
join salaries s
using(emp_no)
left join 
(
    select dm.dept_no,dm.emp_no,s.salary
    from dept_manager dm
    join salaries s
    using(emp_no)
) as q1
using(dept_no)
where s.salary>q1.salary
发表于 2025-03-24 08:19:21 回复(0)
select a.emp_no emp_no,b.emp_no manager_no,c1.salary emp_salary,c2.salary manager_salar
from
dept_emp a
left join salaries c1 on a.emp_no=c1.emp_no
left join dept_manager b on a.dept_no =b.dept_no
left join salaries c2 on b.emp_no=c2.emp_no
where
c1.salary>c2.salary
发表于 2025-03-10 09:12:45 回复(0)
with t1 as(
select a.emp_no, b.emp_no as manager_no
from dept_emp as a
inner join dept_manager as b using(dept_no)
where a.emp_no <> b.emp_no),
t2 as(
select a.emp_no, manager_no, b.salary as emp_salary
from t1 as a
inner join salaries as b
on a.emp_no = b.emp_no)

select a.emp_no, a.manager_no, a.emp_salary, b.salary as manager_salary
from t2 as a
inner join salaries as b
on a.manager_no = b.emp_no
where a.emp_salary > b.salary

发表于 2025-03-06 17:37:21 回复(0)