首页 > 试题广场 >

获取所有非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 de.dept_no,e.emp_no,s.salary
from employees e,dept_emp de,salaries s
where e.emp_no = de.emp_no 
and e.emp_no = s.emp_no
and e.emp_no not in (
    select emp_no
    from dept_manager
)

发表于 2024-04-26 10:21:16 回复(0)
这算法有问题吧,也没说排序啊,整得我都不自信了
发表于 2024-04-14 19:05:47 回复(0)
select t1.dept_no,
t1.emp_no,
salary
from (select de.dept_no,
de.emp_no
from dept_emp de
join dept_manager dm
on de.emp_no = dm.emp_no) t1
join salaries s
on t1.emp_no = s.emp_no
where t1.emp_no != 'dm.emp_no'
  
大佬们这个为啥不对啊,where不是已经排除了manager吗,为什么输出恰好是相反的,输出了manager的信息 
大佬们这个为啥不对啊,where不是已经排除了manager的信息吗,为什么输出恰好是相反的,输出了manager的信息 
编辑于 2024-04-02 23:12:43 回复(0)

左连接

SELECT
    dept_no
    , emp_no
    , salary
FROM employees e
    INNER JOIN dept_emp de
        USING(emp_no)
    INNER JOIN salaries s
        USING(emp_no)
    LEFT JOIN dept_manager dm
        USING(dept_no,emp_no)
WHERE dm.from_date IS NULL
编辑于 2024-03-18 17:39:25 回复(0)
select
    dp.dept_no,
    dp.emp_no,
    salary
from
dept_emp dp join salaries ss on dp.emp_no = ss.emp_no
where
    dp.emp_no not in (
        select
            emp_no
        from
            dept_manager
    )
编辑于 2024-03-01 14:59:41 回复(0)
SELECT
    d.dept_no,
    d.emp_no,
    s.salary
FROM
    dept_emp d
    JOIN salaries s ON s.emp_no = d.emp_no
WHERE
    d.emp_no NOT IN (
        SELECT
            emp_no
        FROM
            dept_manager
    );

编辑于 2024-01-15 17:21:49 回复(0)
select b.dept_no, a.emp_no, s.salary
from employees a
join 
dept_emp b
on a.emp_no = b.emp_no
join salaries s
on s.emp_no = b.emp_no
where a.emp_no not in
(select emp_no
from dept_manager)

发表于 2023-12-17 19:54:35 回复(0)
select
   dept_no,
   d.emp_no,
   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)

发表于 2023-11-13 13:27:49 回复(0)
select de.dept_no,e.emp_no,s.salary 
from employees e 
inner join dept_emp de using(emp_no)
inner join salaries s using(emp_no) 
where s.to_date='9999-01-01' 
and e.emp_no not in(select emp_no from dept_manager);


发表于 2023-11-03 10:46:13 回复(0)
仅用表连接且不用employees表
select a.dept_no,a.emp_no,salary from dept_emp a inner join dept_manager b on a.dept_no=b.dept_no and a.emp_no<>b.emp_no inner join salaries c on a.emp_no=c.emp_no

表连接+where 子查询筛选
select b.dept_no,a.emp_no,salary from employees a left join dept_emp b on
a.emp_no= b.emp_no inner join salaries c on a.emp_no=c.emp_no
where b.to_date='9999-01-01' and c.to_date='9999-01-01' and a.emp_no not in (select emp_no from dept_manager where to_date='9999-01-01')

发表于 2023-10-23 12:13:22 回复(0)
# 获取所有非manager员工薪水情况,给出dept_no、emp_no以及salary,以上例子输出:

select 
t2.dept_no,
t1.emp_no,
t1.salary
from salaries t1 
left join dept_emp t2
on t1.emp_no = t2.emp_no
left join dept_manager t3
on t1.emp_no = t3.emp_no and t2.dept_no = t3.dept_no
where t3.emp_no is null;

发表于 2023-09-08 11:20:02 回复(0)
select ed.dept_no,ed.emp_no,s.salary  
from
(select d.dept_no,e.emp_no from employees e,dept_emp d where e.emp_no=d.emp_no) ed 
join salaries s 
on ed.emp_no=s.emp_no and ed.emp_no 
not in (select emp_no from dept_manager)
解题思路:1)查询所有员工的部门编号、员工编号(将employees与dept_emp表连接)
2)第一步得到的表格再与salaries表连接,获得emp_no,dept_no,salary,此时,需求中的信息都已包括在内
3)最后,查询dept_no,emp_no,salary,条件查询(not in)
注意:一定不要混淆查询字段的表前缀,就会很顺利。
由大到小
发表于 2023-08-22 20:30:15 回复(0)
select d1.dept_no, e1.emp_no, s1.salary
from employees e1 join salaries s1
on e1.emp_no = s1.emp_no
join dept_emp d1
on e1.emp_no = d1.emp_no
where e1.emp_no not in (
    select emp_no from dept_manager
)
发表于 2023-07-11 22:08:13 回复(0)
select a.dept_no, a.emp_no, s.salary
from (select de.dept_no, de.emp_no
from employees e join dept_emp de on e.emp_no=de.emp_no
where de.emp_no not in (
select dm.emp_no
from dept_manager dm
)) a join salaries s on a.emp_no=s.emp_no
where to_date = '9999-01-01'
发表于 2023-03-28 17:29:24 回复(0)
select
de.dept_no
,e.emp_no
,salary
from employees as e
left join dept_emp as de on e.emp_no = de.emp_no
left join dept_manager as dm on e.emp_no = dm.emp_no
left join salaries as sa on e.emp_no = sa.emp_no
where dm.emp_no is null ;
发表于 2023-03-10 15:28:39 回复(0)
# 方法一:
select dept_no, emp_no, salary
from salaries s 
    join dept_emp using(emp_no)
where s.to_date = '9999-01-01'
    and emp_no not in
    (
        select emp_no
        from dept_manager
        where to_date = '9999-01-01'
    );

# 方法二:
select e.dept_no, s.emp_no, s.salary
from salaries s
    left join dept_emp e using(emp_no)
    left join dept_manager m using(emp_no)
where s.to_date = '9999-01-01'
    and m.dept_no is null;

发表于 2023-02-23 21:42:42 回复(0)
想得到非manager员工的关键在于理清 员工表employees 和 部门经理表dept_manager逻辑关系,
选择dept_no作为连接键可将employees表 emp_no与manager表emp_no配对,找出员工和经理间关系; 
当员工no!=经理no,则满足题目需求

select dm.dept_no,
e.emp_no,
salary
from employees e
join dept_emp de on e.emp_no=de.emp_no
join dept_manager dm on de.dept_no=dm.dept_no
join salaries s on s.emp_no=de.emp_no
where de.emp_no !=dm.emp_no


发表于 2023-02-16 22:56:01 回复(1)