首页 > 试题广场 >

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

[编程题]获取所有非manager员工当前的薪水情况
  • 热度指数:320935 时间限制: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 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)
SELECT
    dp.dept_no AS dept_no,
    e.emp_no AS emp_no,
    s.salary AS salary
FROM
    employees e
    INNER JOIN salaries s ON e.emp_no = s.emp_no
    INNER JOIN dept_emp dp ON e.emp_no = dp.emp_no
    LEFT JOIN dept_manager dr ON dp.dept_no = dr.dept_no
    AND e.emp_no = dr.emp_no
WHERE
    dr.emp_no IS NULL;

发表于 2024-10-22 23:12:08 回复(0)
select dept_no, employees.emp_no, salary
from 
employees, dept_emp, salaries
where 
employees.emp_no = dept_emp.emp_no 
and salaries.emp_no = dept_emp.emp_no
and employees.emp_no not in 
(
    select emp_no from dept_manager
)

发表于 2024-09-10 10:47:54 回复(1)
select de.dept_no,de.emp_no,salary
from dept_emp de
inner join dept_manager dm
on de.dept_no=dm.dept_no

inner join salaries s
on de.emp_no=s.emp_no

where de.emp_no in
(select emp_no
from employees
where emp_no not in(select emp_no from dept_manager));
发表于 2024-07-30 16:46:13 回复(0)
select d.dept_no,e.emp_no,salary
from employees e left join dept_emp d on e.emp_no=d.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);
发表于 2024-07-09 10:16:08 回复(0)
小白干出这个题,没有用到第一个(employees)表,说一下思路吧:
  1. 员工表,经理表连接,取出经理的员工号和部门号,并将这个表命名t
  2. 将 t 和 salaries 链接,直接取该员工号的工资。  
以下是代码展示:
select t.dept_no,t.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
)t left join salaries s on t.emp_no = s.emp_no

发表于 2024-06-30 13:51:07 回复(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
    )
发表于 2024-06-30 00:12:20 回复(0)
 select dept_no,
    t1.emp_no,
    t1.salary
from
    dept_emp
    right join (
        select
            employees.emp_no,
            salary
        from
            employees
            left join salaries using (emp_no)
        where emp_no not in (select emp_no from dept_manager)
         
    ) t1
using(emp_no)
我看见这个题的第一思路就是: 
先求出非经理员工的薪水情况,
在连接部门和员工关系表补充部门信息
发表于 2024-06-27 17:02:06 回复(0)
select de.dept_no, de.emp_no, salary from 
dept_emp de join salaries s on de.emp_no= s.emp_no
join dept_manager dm on dm.emp_no != de.emp_no and dm.dept_no = de.dept_no


发表于 2024-06-22 00:29:30 回复(0)
select de.dept_no,
       de.emp_no,
       s.salary 
from dept_emp de join salaries s on de.emp_no=s.emp_no 
                 left join dept_manager dm on de.emp_no=dm.emp_no 
where dm.emp_no is null and    
      s.to_date = "9999-01-01" 

发表于 2024-06-12 18:59:21 回复(0)
select
    not_m_d.dept_no,
    not_m_d.emp_no,
    s.salary
from (
    select not_m.emp_no,d.dept_no
    from
    (
        select
            emp_no
        from employees
        where emp_no not in (
            select emp_no from dept_manager
        ) 
    ) not_m left join dept_emp d
    on not_m.emp_no=d.emp_no
) not_m_d join salaries s
on not_m_d.emp_no=s.emp_no
发表于 2024-06-05 16:34:10 回复(0)
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)