首页 > 试题广场 >

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

[编程题]获取所有非manager员工当前的薪水情况
  • 热度指数:317369 时间限制: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
这题其实就是内连接+ 子查询 ,第一个员工表employees根本就用不到,部门员工关系表dept_emp其实就已经反映了所有的员工,找出员工编号不等于dept_manager中的员工编号的 dept_no  , emp_no ,   salary就行了
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 not in(select emp_no from dept_manager )
发表于 2022-07-14 13:44:39 回复(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 b.dept_no,b.emp_no,d.salary from employees a join dept_emp b
on a.emp_no=b.emp_no join dept_manager c 
on b.dept_no=c.dept_no and b.emp_no!=c.emp_no join salaries d
on a.emp_no=d.emp_no;
发表于 2021-12-07 16:33:18 回复(0)
直接无脑join就能过... ...
SELECT de.dept_no, de.emp_no, s.salary
FROM dept_emp de
JOIN dept_manager dm
ON de.dept_no = dm.dept_no
JOIN salaries s
ON de.emp_no = s.emp_no
WHERE de.emp_no != dm.emp_no


发表于 2021-11-13 18:11:24 回复(0)
SELECT
	t2.dept_no,
	t1.emp_no,
	t1.salary 
FROM
	(
	SELECT
		s.emp_no,
		s.salary,
		m.dept_no 
	FROM
		salaries s
		LEFT JOIN dept_manager m ON s.emp_no = m.emp_no 
	) AS t1
	INNER JOIN dept_emp AS t2 ON t1.emp_no = t2.emp_no 
WHERE
	t1.dept_no IS NULL

发表于 2021-10-05 11:42:18 回复(0)
select de.dept_no, de.emp_no, s.salary
from dept_emp de join salaries s on de.emp_no = s.emp_no
where de.emp_no not in (select emp_no
                       from dept_manager);
发表于 2021-10-05 05:38:35 回复(1)
SELECT de.dept_no, e.emp_no, s.salary
FROM employees e, dept_emp de, dept_manager dm, salaries s
WHERE e.emp_no=de.emp_no and de.dept_no=dm.dept_no and e.emp_no=s.emp_no
and e.emp_no!=dm.emp_no;

发表于 2021-10-02 10:18:46 回复(0)
select de.dept_no,de.emp_no,s.salary from 
(select emp_no from employees where emp_no not in 
 (select distinct emp_no from dept_manager)) e
 join dept_emp as de
 join salaries as s
on e.emp_no = de.emp_no and e.emp_no = s.emp_no and s.to_date='9999-01-01'
发表于 2021-09-17 11:26:25 回复(0)
SELECT A.dept_no,A.emp_no,C.salary
    FROM dept_emp A LEFT JOIN dept_manager B
    ON A.emp_no = B.emp_no
    JOIN salaries C
    ON A.emp_no = C.emp_no
    WHERE B.emp_no IS NULL
发表于 2021-08-04 16:08:03 回复(0)
-- 方法一
select d.dept_no
,e.emp_no
,s.salary
from employees e
join dept_emp d
on e.emp_no = d.emp_no
join salaries s
on e.emp_no = s.emp_no
where e.emp_no not in (
    select emp_no from dept_manager
)

-- 方法二(不需要employees,因为dept_manager除去manager就是其他员工了)
select d.dept_no
,d.emp_no
,s.salary
from dept_emp d
join salaries s
on d.emp_no = s.emp_no
where d.emp_no not in (
    select emp_no from dept_manager
)

发表于 2021-07-20 19:15:54 回复(0)
select dept_no,s.emp_no,salary from dept_emp de 
join salaries s
on de.emp_no = s.emp_no
where s.emp_no not in (
select emp_no from dept_manager
);
发表于 2021-07-06 11:31:17 回复(0)
分享解题思路,全部用join完成:
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 b.dept_no = c.dept_no
right join salaries d on a.emp_no = d.emp_no
where a.emp_no <> c.emp_no

发表于 2021-03-10 23:03:52 回复(0)
SELECT d.dept_no,e.emp_no,s.salary
FROM employees e,dept_emp d,salaries s
WHERE e.emp_no = d.emp_no AND e.emp_no = s.emp_no
AND e.emp_no NOT IN (SELECT emp_no FROM dept_manager)

1.将目标字段所在的三张表格employees,dept_emp,salaries,通过where联系起来;
2.非manager的员工即emp_no不在dept_namager表中的员工,排除掉即可

发表于 2021-02-06 17:35:24 回复(0)
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'
inner join dept_manager dm
on de.dept_no = dm.dept_no
and dm.to_date = '9999-01-01'
where de.emp_no != dm.emp_no;
通过0%,不知道错在哪里了,求助求助
发表于 2020-08-15 21:24:28 回复(1)
select fei.dept_no , fei.emp_no, s.salary
from
(select * from dept_emp where emp_no not in
(select dept_emp.emp_no from dept_emp , dept_manager where dept_emp.emp_no = dept_manager.emp_no)) as fei
join salaries as s
where fei.emp_no = s.emp_no and fei.to_date = '9999-01-01' and s.to_date = '9999-01-01'
发表于 2020-03-18 15:34:06 回复(0)
添加所有非manager员工的薪水情况,不应该包括employees表里有些没部门员工的情况吗?不应该使用左外连接吗?
SELECT de.dept_no,de.emp_no,s.salary
FROM employees e
LEFT JOIN dept_emp de
ON e.emp_no = de.emp_no
INNER JOIN salaries s
ON e.emp_no = s.emp_no
WHERE s.to_date = '9999-01-01'
AND de.to_date = '9999-01-01'
AND e.emp_no NOT IN 
(SELECT emp_no
FROM dept_manager
WHERE to_date = '9999-01-01')

发表于 2020-02-24 13:48:05 回复(2)
SELECT de.dept_no,de.emp_no,s.salary FROM
dept_emp de
JOIN salaries s ON de.emp_no=s.emp_no
WHERE s.to_date='9999-01-01'
AND de.emp_no NOT IN (SELECT emp_no FROM dept_manager WHERE to_date='9999-01-01')
发表于 2019-08-19 09:28:20 回复(0)

获取manager员工

select distinct(emp.emp_no) from dept_manager dm left join employees emp on emp.emp_no = dm.emp_no;

获取员工当前薪水情况

select * from employees emp1 left join salaries s on emp1.emp_no = s.emp_no 
where s.to_date='9999-01-01';
获取非manager员工当前薪水情况
select * from employees emp1 left join salaries s on emp1.emp_no = s.emp_no 
where s.to_date='9999-01-01' and emp1.emp_no not in 
(select distinct(emp.emp_no) from dept_manager dm left join employees emp on emp.emp_no = dm.emp_no);

添加部门信息

select de.dept_no,emp1.emp_no,s.salary from employees emp1 left join salaries s on emp1.emp_no = s.emp_no left join dept_emp de on de.emp_no = emp1.emp_no 
where s.to_date='9999-01-01' and emp1.emp_no not in 
(select distinct(emp.emp_no) from dept_manager dm left join employees emp on emp.emp_no = dm.emp_no);

最后还是没通过,后面发现部门中一个员工可以有多条记录,需要将当前的时间的员工找到。

select de.dept_no,emp1.emp_no,s.salary from employees emp1 left join salaries s on emp1.emp_no = s.emp_no left join dept_emp de on de.emp_no = emp1.emp_no 
where s.to_date='9999-01-01' and de.to_date='9999-01-01' and emp1.emp_no not in 
(select distinct(emp.emp_no) from dept_manager dm left join employees emp on emp.emp_no = dm.emp_no);

至此这题干掉了。

发表于 2018-07-15 00:15:58 回复(0)
select dep.dept_no,e.emp_no,s.salary
from employees e left join dept_emp dep on(dep.emp_no=e.emp_no) left join salaries s on(e.emp_no=s.emp_no)
where e.emp_no not in(select emp_no from dept_manager where to_date='9999-01-01') and
dep.to_date='9999-01-01' 
and s.to_date='9999-01-01';
发表于 2017-09-05 17:47:24 回复(0)
select aa.dept_no,aa.emp_no,aa.salary
from ( dept_emp join salaries  on salaries.emp_no = dept_emp.emp_no  and salaries.to_date='9999-01-01' and dept_emp.to_date='9999-01-01') as aa
where aa.emp_no not in (select emp_no from dept_manager where to_date='9999-01-01')
not in :限定emp_no 不在(select emp_no from dept_manager where to_date = '9999-01-01')子查询的结果集中
编辑于 2017-08-30 10:23:03 回复(0)