首页 > 试题广场 >

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

[编程题]获取员工其当前的薪水比其manager当前薪水还高的相关信息
  • 热度指数:297313 时间限制: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 emp.emp_no,mag.emp_no as manager_no,emp.salary as emp_salary,mag.salary as manager_salary
from (select de.dept_no,de.emp_no,s.salary from dept_emp de inner join salaries s on de.emp_no = s.emp_no and de.to_date='9999-01-01' and s.to_date='9999-01-01')as emp
inner join (select dm.dept_no,dm.emp_no,s.salary from dept_manager dm inner join salaries s on dm.emp_no = s.emp_no and dm.to_date='9999-01-01' and s.to_date='9999-01-01')as mag
on emp.dept_no=mag.dept_no 要保证是同一部门的
where emp.salary>mag.salary

方法二:select de.emp_no,dm.emp_no as manager_no,s1.salary as emp_salary,s2.salary as manager_salary
from salaries s1,salaries s2
inner join dept_emp de on de.emp_no = s1.emp_no and de.to_date='9999-01-01' and s1.to_date='9999-01-01'
inner join dept_manager dm on dm.emp_no = s2.emp_no and dm.to_date='9999-01-01' and s2.to_date='9999-01-01'
where de.dept_no=dm.dept_no and s1.salary>s2.salary

发表于 2019-03-07 16:57:07 回复(0)
更多回答
select de.emp_no,f.emp_no as "manager_no", de.salary, f.salary
from 
    (select dep.emp_no,dept_no,salary 
    from dept_emp dep 
    left join salaries s 
    on dep.emp_no = s.emp_no) de
left join
    (select dept_no, d.emp_no, salary 
    from dept_manager d 
    left join salaries  s 
    on d.emp_no = s.emp_no) f 
on de.dept_no = f.dept_no
where de.salary > f.salary;
发表于 2022-07-22 14:47:31 回复(0)
SELECT emp_no1
,manager_no
,emp_salary
,manager_salary
FROM (
     SElECT de.emp_no emp_no1
      ,ss.salary emp_salary
      ,de.to_date
      ,de.dept_no bumen1
     FROM dept_emp de join salaries ss on de.emp_no = ss.emp_no
     WHERE de.emp_no not in (SELECT ddm.emp_no FROM dept_manager ddm)
     AND de.to_date = '9999-01-01' AND ss.to_date = '9999-01-01'
     ) as chart1
     LEFT JOIN
     (
     SELECT dm.emp_no manager_no
      ,s.salary manager_salary
      ,dm.to_date
      ,dm.dept_no bumen2
     FROM dept_manager dm 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 chart2
     on chart1.to_date = chart2.to_date
WHERE emp_salary > manager_salary
AND bumen1 = bumen2

发表于 2022-06-25 17:58:59 回复(0)
with t1 as
(
select
dept_no,
emp_no as emp_no,
salary as emp_salary
from salaries
join dept_emp using(emp_no)
)
,t2 as
(
select
dept_no,
emp_no as manager_no,
salary as manager_salary
from salaries
join dept_manager using(emp_no)
)

select
emp_no,
manager_no,
emp_salary,
manager_salary
from t1 join t2 using(dept_no)
where emp_salary>manager_salary
先建立员工工资表,再建立老板的工资表
连接查询即可
发表于 2022-05-22 13:06:26 回复(0)
select 
d.emp_no as emp_no,m.emp_no as manager_no,s1.salary,s2.salary as manager_salary
from dept_emp d,
dept_manager m,
salaries s1,
salaries s2
where  d.dept_no = m.dept_no
and d.emp_no = s1.emp_no
and m.emp_no = s2.emp_no
and s1.salary >s2.salary
发表于 2022-03-24 21:58:50 回复(0)
SELECT a.yuangong_num AS emp_no, b.manager_num AS manager_no, a.yuangong_money AS emp_salary, b.manager_money AS manager_salary
FROM (SELECT a.emp_no AS yuangong_num, b.salary AS yuangong_money, a.dept_no
      FROM dept_emp AS a
      INNER JOIN salaries AS b
      ON a.emp_no = b.emp_no
      INNER JOIN dept_manager AS c
      ON a.dept_no = c.dept_no
      WHERE a.emp_no != c.emp_no) AS a
INNER JOIN (SELECT a.emp_no AS manager_num, b.salary AS manager_money, a.dept_no
            FROM dept_manager AS a
            INNER JOIN salaries AS b
            ON a.emp_no = b.emp_no) AS b
ON a.dept_no = b.dept_no
WHERE a.yuangong_money > b.manager_money;

发表于 2022-01-06 09:24:05 回复(0)
with 
q1 as (select a.emp_no,a.dept_no,c.salary from dept_emp a join dept_manager b on a.dept_no=b.dept_no and a.emp_no!=b.emp_no join salaries c on a.emp_no=c.emp_no where a.to_date='9999-01-01'),
q2 as (select a.emp_no,a.dept_no,c.salary from dept_emp a join dept_manager b on a.dept_no=b.dept_no and a.emp_no=b.emp_no join salaries c on a.emp_no=c.emp_no where a.to_date='9999-01-01')
select q1.emp_no,q2.emp_no as manager_no,q1.salary as emp_salary,q2.salary as manager_salary
from q1 join q2 on
q1.dept_no=q2.dept_no and q1.salary>q2.salary;
发表于 2021-12-07 17:17:52 回复(0)
就硬连接,感觉这种连接很难读懂
select det.emp_no,
	dmt.emp_no manager_no,
	st1.salary emp_salary,
	st2.salary manager_salary
from dept_emp det
left join dept_manager dmt
	on det.dept_no=dmt.dept_no
left join salaries st1
	on det.emp_no=st1.emp_no
left join salaries st2
	on dmt.emp_no=st2.emp_no
where det.emp_no!=dmt.dept_no
	and st1.salary>st2.salary

发表于 2021-11-28 16:15:53 回复(0)
# 通过查询将每个员工的emp_no、dept_no、salary生成为一张新表(a表和b表)
SELECT a.emp_no, b.emp_no, a.salary, b.salary
FROM
    (SELECT dept_emp.emp_no, dept_no, salary
    FROM dept_emp
    JOIN salaries
    on dept_emp.emp_no=salaries.emp_no) AS a,
    (SELECT dept_emp.emp_no, dept_no, salary
    FROM dept_emp
    JOIN salaries
    on dept_emp.emp_no=salaries.emp_no) AS b
# 筛选出a表中emp_no不在dept_manager中的数据(筛选出不是manager的数据)
WHERE a.emp_no NOT in (SELECT emp_no FROM dept_manager)
    # 筛选出b表中emp_no在dept_manager中的数据(筛选出是maneger的数据)
    and b.emp_no in (select emp_no from dept_manager)
    # 根据条件筛选出同一部门下员工薪水比manager薪水还高的信息
    and a.dept_no=b.dept_no and a.salary>b.salary;

发表于 2021-11-08 15:12:16 回复(0)
思路:创建员工工资表、经理工资表,筛选出员工工资>经理工资,且 员工 经理在同一部门
select des.emp_no,dms.emp_no,des.salary as emp_salary,dms.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) as des,## 内连接员工-工资表
(select dm.emp_no,dm.dept_no,s.salary from dept_manager dm inner join salaries s on dm.emp_no=s.emp_no) as dms## 内连接员工-工资表
where des.salary>dms.salary ## 员工工资>经理工资
and des.dept_no=dms.dept_no ## 员工所在部门=经理所在部门


发表于 2021-09-26 15:46:06 回复(0)
SELECT es.emp_no,dm.emp_no as manager_no,es.salary as emp_salary,ms.salary as manger_salary
FROM salaries as es
JOIN dept_emp as de
ON es.emp_no = de.emp_no and es.to_date = '9999-01-01' 
JOIN dept_manager as dm
ON de.dept_no = dm.dept_no
JOIN salaries as ms
ON dm.emp_no = ms.emp_no and ms.to_date = '9999-01-01' 
WHERE es.salary > ms.salary

发表于 2021-09-24 15:00:34 回复(0)
select r.emp1,r.emp2,s1.salary,s2.salary from
(select dept_emp.emp_no as emp1,dept_manager.emp_no as emp2 from
dept_emp inner join dept_manager
ON dept_emp.dept_no=dept_manager.dept_no) as r
inner join salaries as s1 on r.emp1=s1.emp_no
inner join salaries as s2 on r.emp2=s2.emp_no
where s1.salary>s2.salary

看我这个 直接无敌 简单起飞
发表于 2021-09-21 21:14:21 回复(0)
SELECT de.`emp_no`,dm.`emp_no` manager_no,sde.`salary` emp_salary,sdm.`salary` manager_salary FROM dept_manager dm JOIN dept_emp de 
ON de.`dept_no`=dm.`dept_no`
 JOIN salaries sde 
ON sde.`emp_no`=de.`emp_no`
JOIN salaries sdm ON sdm.`emp_no`=dm.`emp_no`
WHERE de.`emp_no`!=dm.`emp_no`
AND sde.`salary`>sdm.`salary`
发表于 2021-08-13 16:47:56 回复(0)
SELECT staff.emp_no,manager.emp_no AS manager_no,staff.all_salary AS emp_salary,manager.ma_salary AS manager_salary
    FROM (SELECT A.emp_no,A.dept_no,B.salary AS all_salary
    FROM dept_emp A JOIN salaries B
    ON A.emp_no = B.emp_no) AS staff 
    LEFT JOIN (SELECT C.emp_no,C.dept_no,D.salary AS ma_salary
    FROM dept_manager C INNER JOIN salaries D
    ON C.emp_no = D.emp_no) AS manager
    ON staff.dept_no = manager.dept_no
    WHERE staff.all_salary >manager.ma_salary

发表于 2021-08-04 19:51:34 回复(0)
a表保存员工信息,b表保存经理信息,用部门编号关联,简单
SELECT
    a.emp_no,b.emp_no,a.salary,b.salary
FROM
(
    select de.emp_no,salary,de.dept_no FROM dept_emp de
    left join dept_manager dm on de.dept_no=dm.dept_no
    left join salaries s on de.emp_no = s.emp_no  where de.emp_no!=dm.emp_no
) a,
(
    select de.emp_no,salary,de.dept_no FROM dept_emp de
    left join dept_manager dm on de.dept_no=dm.dept_no 
    left join salaries s on de.emp_no = s.emp_no where de.emp_no=dm.emp_no
) b
WHERE
    a.dept_no=b.dept_no
and 
    a.salary>b.salary


发表于 2021-07-15 19:51:30 回复(0)
兄弟们,代码如下,一次过!!!
select aa.emp_no,aaa.emp_no,aa.salary,aaa.salary
from
(select d1.emp_no,s1.salary,d1.dept_no
from (select * from dept_emp where emp_no not in(select emp_no from dept_manager)) as d1
inner join salaries as s1
on s1.emp_no = d1.emp_no) as aa
inner join 
(select d.emp_no,d.dept_no,s.salary
from dept_manager as d
inner join salaries as s
on d.emp_no = s.emp_no) as aaa
on aa.dept_no = aaa.dept_no
where aa.salary > aaa.salary


发表于 2021-05-23 20:59:37 回复(1)
select a.emp_no,b.manager_no,emp_salary,manager_salary
from dept_emp as a
left join 
(select emp_no as manager_no,dept_no from dept_manager) as b on a.dept_no=b.dept_no
left join
(select salary as manager_salary,emp_no from salaries) as c on c.emp_no=b.manager_no
left join
(select salary as emp_salary,emp_no from salaries) as d on d.emp_no=a.emp_no
where manager_salary<emp_salary
发表于 2021-04-14 11:31:33 回复(0)
通过三个内连接,选出经理,再选经理的薪水,再选员工对应薪水
select de.emp_no, dm.emp_no as manager_no, s2.salary as emp_salary, s1.salary as manager_salary
from dept_emp as de 
    inner join dept_manager as dm
    on de.dept_no = dm.dept_no #选出经理
    inner join salaries as s1
    on s1.emp_no = dm.emp_no #选出经理的薪水
    inner join salaries as s2
    on s2.emp_no = de.emp_no #选出员工对应薪水
where s2.salary > s1.salary

发表于 2021-04-06 22:50:30 回复(0)
select sem.emp_no as emp_no, 
sdm.emp_no as manager_no, 
sem.salary as emp_salary, 
sdm.salary as manager_salary
from (select s.salary, s.emp_no, de.dept_no
      from salaries s inner join dept_emp de 
      on s.emp_no = de.emp_no 
      and s.to_date = '9999-01-01' ) as sem, 
      (select s.salary, s.emp_no, dm.dept_no 
      from salaries s inner join dept_manager dm 
      on s.emp_no = dm.emp_no 
      and s.to_date = '9999-01-01' ) as sdm
where sem.dept_no = sdm.dept_no
and sem.salary > sdm.salary

发表于 2020-12-21 19:52:41 回复(0)

根据条件用join把三张表连接起来,其中salaries表要用到两次因为要连接两个人的工资,最后再用where加上开头那个条件

select de.emp_no,
       dm.emp_no as manager_no,
       se.salary as emp_salary,
       sm.salary as manager_salary
from dept_emp de
join dept_manager dm
on de.dept_no=dm.dept_no
join salaries se
on de.emp_no=se.emp_no
and se.to_date='9999-01-01'
join salaries sm
on dm.emp_no=sm.emp_no
and sm.to_date='9999-01-01'
where se.salary>sm.salary
发表于 2020-09-22 16:16:46 回复(0)
两个子查询很清晰
select a.emp_no,b.emp_no,a.salary,b.salary
from
(select de.emp_no, salary,dept_no
from dept_emp de
inner join 
salaries s
on de.emp_no=s.emp_no) a
inner join
(select dm.emp_no, dept_no,salary
 from
 dept_manager dm
 inner join 
 salaries s
on dm.emp_no=s.emp_no) b
on a.dept_no=b.dept_no
where a.emp_no<>b.emp_no
and a.salary>b.salary


编辑于 2021-03-29 14:35:25 回复(0)

问题信息

难度:
961条回答 28524浏览

热门推荐

通过挑战的用户

查看代码