首页 > 试题广场 >

获取所有员工当前的manager

[编程题]获取所有员工当前的manager
  • 热度指数:485215 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工表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
10003 d002
1995-12-03 9999-01-01
第一行表示为员工编号为10001的部门是d001部门。

有一个部门经理表dept_manager简况如下:
dept_no
emp_no
from_date 
to_date
d001 10002
1996-08-03 9999-01-01
d002 10003
1990-08-05 9999-01-01
第一行表示为d001部门的经理是编号为10002的员工。

获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示,以上例子如下:
emp_no manager
10001 10002

示例1

输入

drop table if exists  `dept_emp` ; 
drop table if exists  `dept_manager` ; 
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`));
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_emp VALUES(10003,'d002','1995-12-03','9999-01-01');
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d002',10003,'1990-08-05','9999-01-01');

输出

10001|10002
本题应注意以下三点:
1、用 INNER JOIN 连接两张表,因为要输出自己的经理,得知自己与经理的部门要相同,故有限制条件 de.dept_no = dm.dept_no
2、再用 WHERE 限制当前员工与当前经理的条件,即 dm.to_date 等于 '9999-01-01' 、de.to_date 等于 '9999-01-01' 、 de.emp_no 不等于 dm.emp_no
3、为了增强代码可读性,将 dept_emp 用别名 de 代替,dept_manager 用 dm 代替,最后根据题意将 de.emp_no 用别名 manager_no 代替后输出
SELECT de.emp_no, dm.emp_no AS manager_no 
FROM dept_emp AS de INNER JOIN dept_manager AS dm
ON de.dept_no = dm.dept_no 
WHERE dm.to_date = '9999-01-01' AND de.to_date = '9999-01-01' AND de.emp_no <> dm.emp_no

编辑于 2018-10-07 23:33:21 回复(79)
更多回答
select d.emp_no,m.emp_no as manager from dept_emp d 
left join dept_manager m on d.dept_no=m.dept_no
where d.emp_no<>m.emp_no 
and d.to_date='9999-01-01' 
and m.to_date='9999-01-01'


发表于 2021-10-08 14:52:05 回复(0)
select emp.emp_no,ma.emp_no
from dept_emp as emp left outer join dept_manager as ma
on emp.dept_no=ma.dept_no
where emp.emp_no<>ma.emp_no and emp.dept_no is not null;
使用外联结,部门为联结键,过滤条件为 员工不是manager(即员工编号与主管的员工编号不一致),此外,还另考虑没有部门编号的员工,使用is not null 排除
发表于 2021-08-14 13:44:44 回复(0)
SELECT dept_emp.emp_no,dept_manager.emp_no AS manager 
FROM dept_emp JOIN dept_manager ON dept_emp.dept_no=dept_manager.dept_no WHERE dept_emp.emp_no NOT IN
(SELECT DISTINCT emp_no FROM dept_manager)

发表于 2021-07-16 01:45:29 回复(0)
select d.emp_no, dm.emp_no as manager_no
from dept_emp as d left join dept_manager as dm
on d.dept_no = dm.dept_no
where d.emp_no != dm.emp_no
and dm.to_date = '9999-01-01'


发表于 2020-03-18 11:17:49 回复(0)
SELECT dept_emp.emp_no,dept_manager.emp_no AS manager_no
FROM dept_emp JOIN dept_manager ON dept_emp.dept_no=dept_manager.dept_no
AND dept_emp.to_date='9999-01-01' 
AND dept_manager.to_date='9999-01-01'
WHERE dept_emp.emp_no!=dept_manager.emp_no;
首先需要明确的是这两张表中的数据,dept_manager的emp_no存在于dept_emp中,但是又不尽相同。先筛选出同一个部门的dept_no,用JOIN ON (默认INNER)同时限定两张表的to_date都为当前日期,所得到的表中dept_emp.emp_no对应的dept_manager.emp_no就是这个部门的经理了。当两个表的emp_no相等即manager为自己。
发表于 2019-10-11 14:40:12 回复(0)
萌新问个问题,为啥你们老用to_date 字段呢?是因为mysql优化的原理吗?
发表于 2021-03-11 15:43:21 回复(15)
为什么都要加AND e.to_date='9999-01-01'
AND m.to_date='9999-01-01'
加上这个有什么意义呢
发表于 2021-07-13 09:16:03 回复(4)
注意点:
1,当前的manager,所以最后的to_date要使用manager表中的字段
2,如果manager是自己,那么不显示。是自己也就是员工编号emp_no和经理编号emp_no是一样的
3,关联条件应该是同一个部门,这样才有上下级关系。也就是 on de.dept_no = dm.dept_no
发表于 2018-01-03 09:41:03 回复(0)
select e.emp_no,m.emp_no as manager_no #将m.emp_no的列名变为manager_no
from dept_manager m,dept_emp e 
where e.dept_no = m.dept_no 
and e.emp_no != m.emp_no 
and m.to_date='9999-01-01';
发表于 2017-07-11 16:14:00 回复(9)

每个部门都有一个manager 每个人都有自己所在的部门 所以用部门号(dept_no)作为桥梁链接两个表 需要注意限制条件 1.时间 2.部门管理员自己不显示

SELECT e.emp_no, m.emp_no 
FROM dept_emp AS e INNER JOIN dept_manager AS m 
ON e.dept_no = m.dept_no
WHERE e.emp_no != m.emp_no 
AND e.to_date = '9999-01-01' 
AND m.to_date = '9999-01-01';

编辑于 2019-03-17 20:36:49 回复(4)
首先将两个表共同查询的切入点是dept_no,其中dept_emp是所有部门员工的信息,而dept_manager是部门manager信息,所以每个员工找相应的manager,只需两表dept_no对应即可;又要求是自己的不显示,则两个dept_no相同,但emp_no不相等,另外to_date相等,都是'9999-01-01'。
select e.emp_no emp_no,m.emp_no manager_no 
from dept_emp e,dept_manager m  
where e.dept_no=m.dept_no 
and e.to_date='9999-01-01' 
and e.to_date=m.to_date 
and e.emp_no!=m.emp_no;


发表于 2017-12-11 17:09:41 回复(0)
已有大神给出答案,我就说一下思考:选什么,关联什么,限制什么。从这几个方面考虑
发表于 2018-05-25 19:56:14 回复(1)
inner join 会将两列中值相同进行连接,而员工部门和manager的部门一定是相同的,这样就将两个表连接起来了。然后从中筛选出员工即是manager的进行排除
select d.emp_no,m.emp_no from dept_emp as d join dept_manager as m
    on d.dept_no = m.dept_no
    where d.emp_no != m.emp_no and m.to_date='9999-01-01'

发表于 2020-12-22 19:53:43 回复(0)
//1.先两个表连接
//2.过滤出雇员本身不是管理者,和管理者是当前管理者状态(.to_date='9999-01-01'
SELECT
    dept_emp.emp_no,
    dept_manager.emp_no
FROM
    dept_emp
LEFT JOIN dept_manager ON dept_emp.dept_no = dept_manager.dept_no
WHERE
    dept_emp.emp_no != dept_manager.emp_no and dept_manager.to_date='9999-01-01';
发表于 2018-06-22 23:22:01 回复(1)
SELECT dp.emp_no, dm.emp_no AS manager_no
FROM dept_emp dp INNER JOIN dept_manager dm
ON dp.dept_no = dm.dept_no
WHERE dm.to_date = '9999-01-01'
AND dp.emp_no <> dm.emp_no

#以上版本可以通过
#但个人觉得部门的员工可能也有一些离职的,也应该像题目中提示的那样,筛选出“当前”
#应该再加上dp.to_date = '9999-01-01'的条件(加上后也可以通过)

编辑于 2017-07-14 17:40:16 回复(0)
select a.emp_no, b.emp_no
from dept_emp a join dept_manager b
on a.dept_no = b.dept_no and a.emp_no<>b.emp_no

发表于 2022-04-21 15:26:49 回复(0)
1.连接,改名
2.把领导跟本人 工号相同的去除
select e.emp_no, m.emp_no as manager
from dept_manager AS m inner join dept_emp AS e
on m.dept_no = e.dept_no
where e.emp_no != m.emp_no


发表于 2021-07-08 16:43:59 回复(0)
SELECT
dept_emp.emp_no,
dept_manager.emp_no AS manager_no
FROM
dept_emp
LEFT JOIN dept_manager ON dept_emp.dept_no = dept_manager.dept_no
WHERE
dept_emp.emp_no <> dept_manager.emp_no
AND dept_manager.to_date = '9999-01-01'
发表于 2017-07-10 16:16:10 回复(0)
manager_no从哪里来的???
发表于 2017-07-09 07:49:24 回复(2)

问题信息

难度:
753条回答 41191浏览

热门推荐

通过挑战的用户

查看代码