首页 > 试题广场 >

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

[编程题]获取员工其当前的薪水比其manager当前薪水还高的相关信息
  • 热度指数:312820 时间限制: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 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 
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)
思路:创建员工工资表、经理工资表,筛选出员工工资>经理工资,且 员工 经理在同一部门
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 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 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)
1,找到员工薪水
2,找到经理薪水
3,连接起来后找出符合条件的员工
select es.emp_no as emp_no,ms.emp_no as manager_no,es.emp_salary as emp_salary,ms.manager_salary as manager_salary
from
(
select de.emp_no,de.dept_no,s.salary as emp_salary
from dept_emp as de join salaries as s on de.emp_no=s.emp_no and s.to_date='9999-01-01'
where de.emp_no not in (select emp_no from dept_manager)
    ) es
join 
(
select dm.emp_no,dm.dept_no,s.salary as manager_salary
from dept_manager as dm join salaries as s on dm.emp_no=s.emp_no and s.to_date='9999-01-01'
) ms
on es.dept_no=ms.dept_no
where es.emp_salary>ms.manager_salary;
发表于 2020-07-06 22:00:38 回复(0)
成功了,但是查取效率应该不高,es 是员工当前薪水信息表,ms是经理当前薪水表,之前不通过忘了加上de.dept_no和dm.dept_no字段,这两个字段是es和ms联结的关键,本办法,思路清晰啊  哈哈哈~~~
select es.emp_no, ms.emp_no manager_no, es.salary emp_salary, ms.salary manager_salary
from 
    (select de.emp_no, s1.salary, de.dept_no from dept_emp de inner join salaries s1 
     on de.emp_no = s1.emp_no and de.to_date = s1.to_date where s1.to_date = '9999-01-01') as es
inner join 
    (select dm.emp_no, s2.salary, dm.dept_no from dept_manager dm inner join salaries s2 
     on dm.emp_no = s2.emp_no and dm.to_date = s2.to_date where s2.to_date = '9999-01-01') as ms
on es.dept_no = ms.dept_no where emp_salary > manager_salary

发表于 2019-08-21 15:38:03 回复(2)
select aa.emp_no,bb.emp_no as manager_no,aa.salary as emp_salary,bb.salary as manager_salary from
(select a.emp_no,b.salary,a.dept_no from dept_emp a join salaries b
on a.emp_no = b.emp_no and b.to_date='9999-01-01' and a.to_date='9999-01-01') as aa,
(select a.emp_no,b.salary,a.dept_no from dept_manager a join salaries b
on a.emp_no = b.emp_no and b.to_date='9999-01-01' and a.to_date='9999-01-01') as bb
where aa.emp_no != bb.emp_no
and aa.salary > bb.salary
and aa.dept_no = bb.dept_no
发表于 2018-04-21 20:48:40 回复(0)
找出员工的薪资等信息 再找出经理的薪资等信息 , 最后只要是同一个部门的职工和经理 并且满足职工的薪水比经理要多 就可以写出来了。
虽然我不确定职工表里面的emp_no会不会掺杂经理的emp_no但我还是保险起见 让员工的emp_no不在所有的经理emp_no里面了,以防万一。de.emp_no not in (select emp_no from dept_manager)

select EmpInfo.emp_no as emp_no, ManagerInfo.emp_no as manager_no , EmpInfo.salary as emp_salary, ManagerInfo.salary as manager_salary
from (select de.emp_no , s.salary , de.dept_no
        from dept_emp de , salaries s , dept_manager dp
        where de.emp_no = s.emp_no
        and dp.dept_no = de.dept_no
        and s.to_date = '9999-01-01'
        and de.emp_no not in (select emp_no from dept_manager)) EmpInfo , (select de.emp_no , sa.salary , de.dept_no
                                                                            from dept_manager de , salaries sa
                                                                            where sa.to_date = '9999-01-01'
                                                                            and de.emp_no = sa.emp_no) as ManagerInfo
where  EmpInfo.dept_no = ManagerInfo.dept_no
and EmpInfo.salary > ManagerInfo.salary
发表于 2018-03-10 14:55:53 回复(2)
- -把部门要一样给忘了搞了好一会。。
select no_manager.emp_no emp_no,dm.emp_no manager_no,no_manager.salary emp_salary,s.salary manager_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'
inner join
(
  select de.emp_no,s.salary,de.dept_no
  from dept_emp de
  left join dept_manager dm on de.emp_no = dm.emp_no and dm.to_date = '9999-01-01'
  inner join salaries s on de.emp_no = s.emp_no and s.to_date = '9999-01-01'
  where de.to_date = '9999-01-01' and  dm.emp_no is null
) as no_manager
on no_manager.salary > s.salary and no_manager.dept_no = dm.dept_no;
发表于 2018-01-26 19:55:33 回复(0)
select de.emp_no ,(dm.emp_no) as manager_no , (s1.salary) as emp_salary ,(s2.salary) as manager_salary
from salaries as s1, salaries as s2
inner join dept_emp as de on de.emp_no =s1.emp_no
inner join dept_manager as dm on dm.emp_no =s2.emp_no
where de.dept_no=dm.dept_no
and s1.to_date='9999-01-01'
and s2.to_date='9999-01-01'
and s1.salary>s2.salary




编辑于 2017-09-15 14:10:42 回复(12)
本题主要思想是创建两张表(一张记录当前所有员工的工资,另一张只记录部门经理的工资)进行比较,具体思路如下:
1、先用INNER JOIN连接salaries和demp_emp,建立当前所有员工的工资记录sem
2、再用INNER JOIN连接salaries和demp_manager,建立当前所有员工的工资记录sdm
3、最后用限制条件sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary找出同一部门中工资比经理高的员工,并根据题意依次输出emp_no、manager_no、emp_salary、manager_salary
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


编辑于 2017-07-15 15:08:45 回复(58)
SELECT D.emp_no,M.emp_no,S.salary,V.salary

FROM dept_emp AS D JOIN dept_manager AS M ON D.dept_no = M.dept_no
JOIN salaries AS S ON D.emp_no = S.emp_no JOIN salaries AS V ON V.emp_no = M.emp_no

WHERE D.emp_no != M.emp_no AND V.salary < S.salary
发表于 2021-10-21 23:10:36 回复(0)
这种场景,最重要的是学会拆分,把复杂的查询分成一个个简单的查询,最后再将其组合在一起,这便是分合的思想。 
先查出员工的工号和薪水:
SELECT de.emp_no,sa.salary FROM dept_emp de,salaries sa WHERE de.emp_no=sa.emp_no AND de.to_date='9999-01-01' AND sa.to_date='9999-01-01'
再查出经理的工号和薪水:
SELECT dm.emp_no manager_no,sal.salary FROM dept_manager dm,salaries sal WHERE dm.emp_no=sal.emp_no AND dm.to_date='9999-01-01' AND sal.to_date='9999-01-01'
接着就是组合,看准条件,做好条件衔接:
SELECT de.emp_no,dm.emp_no manager_no, sa.salary emp_salary,sal.salary manager_salary FROM dept_emp de,salaries sa,dept_manager dm,salaries sal WHERE de.emp_no=sa.emp_no AND dm.emp_no=sal.emp_no AND de.dept_no=dm.dept_no AND de.to_date='9999-01-01' AND sa.to_date='9999-01-01' AND dm.to_date='9999-01-01' AND sal.to_date='9999-01-01' AND sa.salary>sal.salary

发表于 2018-09-09 15:18:32 回复(22)
我的浅显易懂!格式又好!
select  s.emp_no as emp_no, 
            dm.emp_no as manager_no, 
            s.salary as emp_salary, 
            ss.salary as manager_salary
from salaries as s

join dept_emp as de
on s.emp_no=de.emp_no

join dept_manager as dm
on de.dept_no=dm.dept_no

join salaries as ss
on ss.emp_no=dm.emp_no

where     
      s.to_date='9999-01-01' 
      and ss.to_date='9999-01-01'
      and s.salary>ss.salary;


发表于 2019-06-27 15:52:46 回复(7)
只用自然连接就可以做出来

select 
    a.emp_no,
    b.emp_no,
    c.salary,
    d.salary
from 
    dept_emp a,
    dept_manager b,
    salaries c,
    salaries d
where 
    a.dept_no=b.dept_no
    and a.emp_no<>b.emp_no
    and a.emp_no=c.emp_no
    and b.emp_no=d.emp_no
    and c.salary>d.salary;
发表于 2021-07-18 09:50:48 回复(1)
先构建两个表,然后连接起来即可
select t1.emp_no,manager_no,emp_salary,manager_salary
from(
select dept_no,d1.emp_no,salary as emp_salary
from dept_emp as d1 inner join salaries as s on d1.emp_no=s.emp_no
where d1.to_date='9999-01-01' and s.to_date='9999-01-01'
) t1 ---员工工资表
inner join(
select dept_no,d2.emp_no as manager_no,salary as manager_salary
from dept_manager as d2 inner join salaries as s on d2.emp_no=s.emp_no
where d2.to_date='9999-01-01' and s.to_date='9999-01-01'
) t2 ---部门经理工资表
on t1.dept_no=t2.dept_no  -----员工工资表与经理工资表是根据同个部门联结的
where t1.emp_salary>t2.manager_salary;
发表于 2020-07-12 10:47:27 回复(0)