首页 > 试题广场 >

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

[编程题]获取所有非manager员工当前的薪水情况
  • 热度指数:340675 时间限制: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, e.emp_no, salary
from employees as e
join salaries as s on e.emp_no = s.emp_no
join dept_emp as d on d.emp_no = s.emp_no
where e.emp_no not in (select emp_no from dept_manager)
发表于 2025-11-11 19:35:28 回复(0)
select 
x.dept_no
,x.emp_no
,salary 
from dept_emp x 
join employees y 
on x.emp_no=y.emp_no
join salaries z
on y.emp_no=z.emp_no 
where x.emp_no not in (select emp_no from dept_manager)

发表于 2025-10-15 11:54:00 回复(0)
select
    de.dept_no,
    de.emp_no,
    sa.salary
from
    employees as em
    left join dept_emp as de on em.emp_no = de.emp_no
    inner join salaries as sa on sa.emp_no = em.emp_no
where
    em.emp_no not in(
        select
            emp_no
        from
            dept_manager);
发表于 2025-09-24 17:18:04 回复(0)
WITH w01 AS (
    # 先筛选出非管理的员工信息+字段过滤
    SELECT emp_no, dept_no  FROM dept_emp
    WHERE emp_no NOT IN(SELECT emp_no FROM dept_manager WHERE to_date='9999-01-01')
        AND to_date='9999-01-01'
), w02 AS (
    # 字段过滤
    SELECT emp_no, salary FROM salaries WHERE to_date='9999-01-01' # 表示是否还发放薪水,简介证明是否在职
)
SELECT dept_no, emp_no, salary
FROM w01
INNER JOIN employees USING(emp_no)
INNER JOIN w02 USING(emp_no)

发表于 2025-08-11 10:56:18 回复(0)
select dept_no, emp_no, salary from(
select a.dept_no, a.emp_no, c.salary, b.emp_no as jingli 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) t1
where emp_no != jingli

发表于 2025-08-01 11:41:00 回复(0)

select t.dept_no,s.emp_no,s.salary
from salaries s
inner join(
    select d.*
    from dept_emp d
    where d.emp_no not in(
        select emp_no
        from dept_manager
    )
) t
on s.emp_no = t.emp_no
发表于 2025-06-21 16:41:12 回复(0)
可以直接在表连接 的 ON 后面 AND 一个判断条件(是否是manager)
select 
    de.dept_no,de.emp_no,salary
from   
    dept_emp          as de 
    join dept_manager as dm on de.dept_no=dm.dept_no AND de. emp_no<>dm.emp_no
    join salaries     as sa on sa.emp_no = de.emp_no


发表于 2025-06-04 20:03:31 回复(0)
select
    d.dept_no,
    s.emp_no,
    s.salary
from
    salaries s
    join dept_emp d on s.emp_no = d.emp_no
    join dept_manager d2 on d.dept_no = d2.dept_no
    and d.emp_no != d2.emp_no;


发表于 2025-05-25 11:01:55 回复(0)
select
b.dept_no
,a.emp_no
,salary

from employees a,dept_emp b,salaries c,dept_manager d
where a.emp_no = b.emp_no
and b.emp_no = c.emp_no
and d.dept_no = b.dept_no
and a.emp_no != d.emp_no
发表于 2025-05-10 19:51:21 回复(0)
select m.dept_no,m.emp_no,m.salary from (SELECT e.emp_no, d.dept_no, s.salary FROM employees e, dept_emp d, salaries s WHERE e.emp_no = d.emp_no AND d.emp_no = s.emp_no)  m where m.emp_no not in (select emp_no from dept_manager);
发表于 2025-05-04 20:49:04 回复(0)
SELECT d.dept_no, s.emp_no, s.salary
FROM dept_emp d JOIN salaries s ON d.emp_no = s.emp_no LEFT JOIN dept_manager m ON d.emp_no = m.emp_no
WHERE m.emp_no IS NULL
发表于 2025-04-20 15:24:49 回复(0)
select b.dept_no, a.emp_no, c.salary from employees as a left join dept_emp as b
on a.emp_no = b.emp_no left join salaries as c on a.emp_no = c.emp_no
where a.emp_no not in (
    select emp_no from dept_manager
)
发表于 2025-03-22 17:25:33 回复(0)
获取非Manager员工列表
with t1 as(
select *
from employees
left outer join dept_manager using(emp_no)
where dept_no is null)
获取非Manager员工的薪水情况
select dept_no, emp_no, salary
from dept_emp
inner join salaries using(emp_no)
where emp_no  IN (Select emp_no from t1)



发表于 2025-03-06 17:10:17 回复(0)
select
d.dept_no,d.emp_no,s.salary
from
dept_emp d 
left join dept_manager d1 on d.emp_no= d1.emp_no
left join salaries s on s.emp_no =d.emp_no 
where
d1.emp_no is null
我这种就很简单把
发表于 2025-02-27 14:44:07 回复(0)
select t2.dept_no, t4.emp_no, t4.salary
from dept_emp t2 inner join salaries t4 on t2.emp_no=t4.emp_no
where t2.emp_no not in (select emp_no from dept_manager t3)
;

发表于 2025-02-26 13:52:05 回复(0)
select b.dept_no
,b.emp_no
,d.salary
from dept_emp b join dept_manager c on b.dept_no=c.dept_no
join salaries d on b.emp_no=d.emp_no
where b.emp_no!=c.emp_no

发表于 2025-01-13 14:19:13 回复(0)
select dept_no,emp_no,salary
from employees
join dept_emp using(emp_no)
join salaries using(emp_no)
where emp_no not in (select emp_no from dept_manager)
思路比较明确,经理在经理表中,另外三个表需要连接才能找到所有信息,用using合并后此列不会出现两次
发表于 2024-12-27 18:58:13 回复(0)
select d1.dept_no,d1.emp_no,s.salary
from employees as e
left join dept_emp as d1
on e.emp_no=d1.emp_no
left join salaries as s
on e.emp_no=s.emp_no and s.to_date='9999-01-01'
where e.emp_no in
(select d1.emp_no
from dept_emp as d1
left join dept_manager as d2
on d1.dept_no=d2.dept_no
where d1.emp_no !=d2.emp_no 
and (d2.to_date = '9999-01-01') )
注意在职问题
发表于 2024-10-29 17:55:11 回复(0)