首页 > 试题广场 >

获取所有员工的emp_no

[编程题]获取所有员工的emp_no
  • 热度指数:54637 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received,没有分配奖金的员工不显示对应的bonus类型btype和received
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 `emp_bonus`(
emp_no int(11) NOT NULL,
received datetime NOT NULL,
btype smallint(5) NOT NULL);

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`));


返回的结果格式如下:
e.emp_no dept_no btype received
10001 d001 1 2010-01-01
10002 d001 2 2010-10-01
10003 d004 3 2011-12-03
10004 d004 1 2010-01-01
10005 d003
10006 d002
10007 d005
10008 d005
10009 d006
10010 d005
10010 d006
本题严谨的思路为,先将 employees与dept_emp 用 INNER JOIN 连接,挑选出分配了部门的员工,再用 LEFT JOIN 连接 emp_bonus(在前面的题中可看到此表),分配了奖金的员工显示奖金类型和授予时间,没分配奖金的员工则不显示。
SELECT em.emp_no, de.dept_no, eb.btype, eb.recevied
FROM employees AS em INNER JOIN dept_emp AS de
ON em.emp_no = de.emp_no
LEFT JOIN emp_bonus AS eb 
ON de.emp_no = eb.emp_no
由于dept_emp表中都是已分配部门的员工,因此只用 dept_emp表与emp_bonus表就可以解决问题:
SELECT de.emp_no, de.dept_no, eb.btype, eb.recevied
FROM dept_emp AS de LEFT JOIN emp_bonus AS eb 
ON de.emp_no = eb.emp_no

编辑于 2017-07-24 10:18:40 回复(22)
牛客网刷题简直在做阅读找茬,就不能好好考察逻辑?
输出格式-received/题目表格中-recevied;
就嗯降低通过率,建议击毙@平安牛客网
发表于 2020-05-13 10:58:37 回复(0)
select e.emp_no,de.dept_no,eb.btype,eb.recevied
from employees e 
inner join dept_emp de on e.emp_no=de.emp_no
left join  emp_bonus eb on e.emp_no=eb.emp_no

以上是代码,该题目中的dept_manager 表和salaries表不会用到,并且缺了一个 emp_bonus 表,emp_bonus 表可以从题库里获取奖金的员工当前工资加10%的那道题找到。

emp_bonus表结构为:
create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null)
;

1、内连接 employees表和 dept_emp 表,限定量表的emp_no相同,找出现役员工。
2、左外链接 emp_bonus 表,限定emp_no相同,只要在emp_bonus中有记录就代表有获得奖金。

结果:由于左外连接,那么又在emp_bonus中有记录,获取过奖金的员***显示,在emp_bouns中没有过记录即没有获取过奖金的员工只显示 emp_no和dept_no
编辑于 2017-11-30 17:12:03 回复(1)
不得不吐槽一下题目,首先,题意不明确;其次,表需要从前面找,如果没有按顺序做下来,还真不知道有哪些表。。。
言归正传,我们看下这题如何解答?
首先,题目描述:获取所有员工的emp_no、部门编号dept_no以及对应的奖金类型类型btype和recevied字段,没有分配奖金的员工不显示。
其次,相关的表dept_emp, emp_bonus(见《将所有获取奖金的员工当前的薪水增加10%》题中),这里只需要一个左连接(left join)就可以知道员工emp_no, dept_no, 如果没有对应的奖金就不显示(为NULL)。

select de.emp_no, de.dept_no, eb.btype, eb.recevied
from dept_emp as de left join emp_bonus as eb
on de.emp_no = eb.emp_no

编辑于 2017-09-11 20:09:01 回复(1)
到今天还是没有修改通过要求,正确应该是eb.received
但是只有写成eb.recevied才会通过
发表于 2020-05-17 22:43:01 回复(1)
没有分配部门的员工就不算员工了?说好的所有员工呢?
发表于 2020-09-23 16:27:51 回复(1)
select de.emp_no,de.dept_no, bo.btype, bo.received 
from dept_emp as de
left join emp_bonus as bo
on de.emp_no = bo.emp_no
bonus表原本设定非空,left join bo表变为null

发表于 2021-02-18 16:51:13 回复(0)
select t1.emp_no, t2.dept_no, 
case when t3.btype then t3.btype end as btype, 
case when t3.received then t3.received end as received
from employees as t1
inner join dept_emp as t2
on t1.emp_no=t2.emp_no
left join emp_bonus as t3
on t1.emp_no=t3.emp_no
;
发表于 2020-07-01 00:39:55 回复(0)
题里也没说清楚没有分配是什么没有分配,要是部门也没有分配呢?不应该用两个LEFT JOIN 吗
发表于 2020-06-13 15:00:20 回复(2)

注意:题中的 received 拼成了 recevied ,属实 emmm...

select e.emp_no, de.dept_no, eb.btype, eb.recevied
from employees e inner join dept_emp de on e.emp_no = de.emp_no
left join emp_bonus eb on e.emp_no = eb.emp_no
编辑于 2019-08-26 20:40:14 回复(0)
select e.emp_no , de.dept_no as dept_no, eb.btype as btype, eb.recevied as recevied
from employees  e inner join dept_emp  de on e.emp_no = de.emp_no left join 
emp_bonus  eb on e.emp_no = eb.emp_no;
发表于 2018-03-20 09:40:07 回复(0)
select d.emp_no,d.dept_no,b.btype,b.received
from dept_emp as d left join emp_bonus as b
on d.emp_no = b.emp_no
where btype,received(select emp_no from dept_emp where emp_no not in emp_bonus)
is null;
我一开始这样写的。因为题目里没说明我就默认所有员工都分配部门了,还觉得题目多给了一个表....
后来报错把后面WHERE那句删了想看看会输出什么,结果居然对了..
select d.emp_no,d.dept_no,b.btype,b.received
from dept_emp as d left join emp_bonus as b
on d.emp_no = b.emp_no;
忘了left join数据为空时本来就是NULL了..错上加错最后居然蒙对了

编辑于 2021-02-18 12:31:16 回复(0)
select e.emp_no,de.dept_no,btype,received
from employees e inner join dept_emp de on e.emp_no=de.emp_no
left join emp_bonus eb on de.emp_no=eb.emp_no;

发表于 2021-02-01 00:02:32 回复(0)
select e.emp_no,de.dept_no,eb.btype ,eb.received 
from employees e 
    left join emp_bonus eb 
    on e.emp_no =eb.emp_no 
    join (select * from dept_emp ) de
    on e.emp_no=de.emp_no

发表于 2021-01-31 12:25:44 回复(0)
明显是没分配部门的员工,直接不显示。
我这题目是“没分配奖金的员工”,我一直再尝试找“没分配奖金”等于什么,等于emp_no not in table `emp_bonus`?
发表于 2021-01-20 17:10:30 回复(0)
题目真是,明明说所有员工(使用employees 左连接),结果一定要是所有分配了部门的员工(可不用employees)才通过。题意不准确。
发表于 2020-12-29 15:28:33 回复(0)
select e.emp_no,d.dept_no,eb.btype,eb.received from employees e join 
dept_emp d on d.emp_no=e.emp_no left join 
emp_bonus eb on eb.emp_no=e.emp_no;
发表于 2020-12-21 22:56:45 回复(0)
表连接inner join和 left join:
select e.emp_no,d.dept_no,eb.btype,eb.received from employees e 
join dept_emp d on e.emp_no=d.emp_no 
left join emp_bonus eb on e.emp_no=eb.emp_no;

发表于 2020-12-19 23:22:55 回复(0)

这里联结employees表和dept_emp表时要使用inner join,而不能使用left join

SELECT e.emp_no,dept_no,btype,received
FROM employees AS e
INNER JOIN dept_emp AS de
ON e.emp_no=de.emp_no
LEFT JOIN emp_bonus AS eb
ON e.emp_no=eb.emp_no
发表于 2020-12-09 09:40:34 回复(0)
SELECT de.emp_no, de.dept_no, eb.btype, eb.received 
FROM dept_emp AS de LEFT JOIN emp_bonus AS eb ON de.emp_no = eb.emp_no; 
发表于 2020-12-01 09:31:22 回复(0)