首页 > 试题广场 >

获取所有非manager员工当前的薪水情况

[编程题]获取所有非manager员工当前的薪水情况
  • 热度指数:306436 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工表employees简况如下:
emp_no 
birth_date 
first_name 
last_name 
gender hire_date 
10001
1953-09-02
Georgi     
Facello   
 M 1986-06-26
10002 1964-06-02 Bezalel Simmel  F 1996-08-03

有一个,部门员工关系表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 1986-06-26
9999-01-01
10002 72527 1996-08-03
9999-01-01

获取所有非manager员工薪水情况,给出dept_no、emp_no以及salary,以上例子输出:
dept_no
emp_no
salary
d001 10001 88958

示例1

输入

drop table if exists  `dept_emp` ; 
drop table if exists  `dept_manager` ; 
drop table if exists  `employees` ; 
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 `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_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 employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1996-08-03');
INSERT INTO salaries VALUES(10001,88958,'1986-06-26','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','9999-01-01');

输出

d001|10001|88958
select dept_no,employees.emp_no,salary from employees,dept_emp,salaries where 
employees.emp_no=dept_emp.emp_no and 
employees.emp_no=salaries.emp_no and 
employees.emp_no != (select dept_manager.emp_no from employees,dept_manager where 
                     employees.emp_no=dept_manager.emp_no)
发表于 2022-05-18 23:19:41 回复(0)
就是 not in ,嘻嘻
select d.dept_no,s.emp_no,s.salary
from salaries s join dept_emp d on s.emp_no=d.emp_no
where s.emp_no not in (select emp_no from dept_manager)


发表于 2022-05-09 20:16:47 回复(0)
感觉not in可以少连接一次,但是还是觉得左连接看的清爽一点
select de.dept_no, de.emp_no, s.salary
from dept_emp de
         left join dept_manager dm 
                on de.emp_no = dm.emp_no
         join salaries s 
                on de.emp_no = s.emp_no
where dm.dept_no is null;


发表于 2022-04-26 10:50:08 回复(0)
Select
  a.dept_no,
  a.emp_no,
  b.salary
from
  dept_emp a
  join salaries b on a.emp_no = b.emp_no
Where
  a.emp_no = (
    Select
      c.emp_no
    from
      employees c
      left join dept_manager d on c.emp_no = d.emp_no
    Where
      d.emp_no is null
  )


想问一下自己写的这个错哪里了?
发表于 2022-04-23 22:44:54 回复(0)
select 
b.dept_no, b.emp_no, c.salary
from employees a 
join dept_emp b on a.emp_no = b.emp_no
join salaries c on a.emp_no = c.emp_no
where b.emp_no not in (
    select emp_no from dept_manager
)
发表于 2022-04-15 17:28:11 回复(0)
select de.dept_no,s.emp_no,s.salary
from salaries s
join dept_emp de
on s.emp_no = de.emp_no
join dept_manager dm
on dm.dept_no = de.dept_no
--join employees e
--on e.emp_no = s.emp_no
where s.emp_no != dm.emp_no


--来自深圳居家办公的果果果子2022年3月14日9:53
发表于 2022-03-14 09:54:01 回复(0)
SELECT  d_e.dept_no,e.emp_no,s.salary
    FROM employees e 
    INNER JOIN dept_emp d_e ON d_e.emp_no =e.emp_no
    INNER JOIN salaries s ON e.emp_no =s.emp_no
      WHERE e.emp_no NOT IN (SELECT emp_no FROM dept_manager)

发表于 2022-03-12 15:50:25 回复(0)
直接连表操作 然后 a.emp_no != c.emp_no 过滤掉所有 在经理表中存在的 人员id就是想要的结果了
select c.dept_no,a.emp_no,d.salary from employees a join dept_emp b using(emp_no) 
join dept_manager c on b.dept_no = c.dept_no and a.emp_no != c.emp_no
join salaries d on a.emp_no = d.emp_no
发表于 2022-03-04 11:05:34 回复(0)
select de.dept_no, e.emp_no, s.salary
from employees e join dept_emp de on e.emp_no = de.emp_no
join salaries s on de.emp_no = s.emp_no
where e.emp_no not in (select emp_no from dept_manager);
发表于 2022-03-03 21:10:03 回复(0)
select e.dept_no,e.emp_no,s.salary from dept_emp e 
join salaries s on s.emp_no=e.emp_no
left join dept_manager  m on e.emp_no=m.emp_no
where m.emp_no is null 
发表于 2022-02-27 19:41:48 回复(0)
select de.dept_no,de.emp_no,s.salary
FROM salaries s
JOIN dept_emp de
on s.emp_no=de.emp_no
WHERE s.emp_no not in (select DISTINCT emp_no from dept_manager)
发表于 2022-02-27 07:51:20 回复(0)
select b.dept_no,a.emp_no,d.salary
from employees a 
inner join dept_emp b 
on a.emp_no=b.emp_no
inner join salaries d 
on a.emp_no=d.emp_no
where a.emp_no not in (select emp_no from dept_manager
                      )
两个内连接,获得在其他表上的dept_no,salary,再用where…not in
排除在dept_manager出现的emp_no,
发表于 2022-02-23 08:55:14 回复(0)
我的写法可能想复杂了,但是既然是练习,多想想也没啥损失。
-- 查询最新的薪水表:题目问当前的薪水情况,实际要考虑一个人在任职期间有加薪或减薪的情况,所以需要获取最新的薪水数据
SELECT emp_no,salary,rank() OVER(PARTITION BY emp_no ORDER BY from_date DESC) AS rank1 FROM salaries
WHERE to_date='9999-01-01';
-- 查询最新的部门经理表:题目非manger员工,我倾向认为一个人在任职期间,有过升职或降职,所以需要获取最新的经理级别名单
SELECT emp_no,rank() OVER(PARTITION BY emp_no ORDER BY from_date DESC) AS rank2 FROM dept_manager
WHERE to_date='9999-01-01';

-- 开始解题:
SELECT A.dept_no,A.emp_no,E.salary FROM dept_emp A
LEFT JOIN (SELECT D.emp_no,D.salary FROM (SELECT emp_no,salary,rank() OVER(PARTITION BY emp_no ORDER BY from_date DESC) AS rank1 FROM salaries
                                         WHERE to_date='9999-01-01') D
           WHERE D.rank1=1
          ) E
ON A.emp_no = E.emp_no
WHERE A.emp_no NOT IN (SELECT B.emp_no FROM (SELECT emp_no,rank() OVER(PARTITION BY emp_no ORDER BY from_date DESC) AS rank2 FROM dept_manager
                                        WHERE to_date='9999-01-01') B
                     WHERE B.rank2 = 1
                    );

发表于 2022-02-14 10:11:10 回复(0)
大佬们救救
为啥这样自测就能通过,保存提交的时候就少数据呢?
select b.dept_no, a.emp_no, d.salary
from employees a left join dept_emp b on a.emp_no=b.emp_no
                 left join dept_manager c on a.emp_no=c.emp_no
                 left join salaries d on a.emp_no=d.emp_no
where a.emp_no<>(select emp_no from dept_manager)
发表于 2022-01-20 15:07:24 回复(0)
select aa.dept_no,aa.emp_no,sa.salary
from (select emp_no,dept_no from dept_emp
where emp_no not in (select emp_no from dept_manager)) aa
join salaries sa on aa.emp_no=sa.emp_no

发表于 2022-01-07 23:16:02 回复(0)
//通过左连接查询出部门编号以及员工编号,暂存到t表当中。
with t as (
    select de.emp_no, de.dept_no
    from employees e left join dept_emp de on e.emp_no = de.emp_no
)
//查询出员工编号不在manager表中的员工,对应部门号以及工资。
select t.dept_no, t.emp_no, s.salary
from t left join salaries s on t.emp_no = s.emp_no
where t.emp_no not in (
    select emp_no 
    from dept_manager
)
发表于 2021-12-06 14:43:53 回复(0)
*1.找部门经理的id    2.在所有员工中排除部门经理的id (NOT IN)    3.非经理的员工表和薪水表 salaries 连接
select t.dept_no,t.emp_no,s.salary
from salaries s,(
                 select dept_no,emp_no
                 from dept_emp 
                 where emp_no NOT IN (select emp_no
                                     from dept_manager
                                     group by emp_no)) as t
where s.emp_no = t.emp_no

sql语句看似很麻烦,仔细想清楚逻辑,每一次做一个操作,然后结合起来并不难
发表于 2021-11-17 14:50:27 回复(0)

1、四表连接+not in
SELECT d.dept_no,e.emp_no,s.salary
FROM dept_emp d
INNER JOIN dept_manager dm ON d.dept_no=dm.dept_no
INNER JOIN employees e ON d.emp_no=e.emp_no
INNER JOIN salaries s ON d.emp_no=s.emp_no
WHERE e.emp_no NOT IN(SELECT d.emp_no
	FROM dept_manager d)
AND s.to_date='9999-01-01'


发表于 2021-10-09 12:39:40 回复(0)
select d.dept_no, d.emp_no, s.salary 
from 
    (select de.dept_no, de.emp_no from dept_emp de 
    left join dept_manager dm on de.emp_no = dm.emp_no
    where dm.emp_no is null) d
join salaries s on s.emp_no = d.emp_no;

发表于 2021-10-09 09:22:17 回复(0)
有哪个大佬知道如何减少占用内存吗,求翻牌子😂
发表于 2021-09-23 16:21:06 回复(0)