19

查找所有员工的last_name和first_name以及对应的dept_name

http://www.nowcoder.com/questionTerminal/5a7975fabe1146329cee4f670c27ad55

题目:查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

方法1:先内连接departments表和dept_emp表形成新表b,再左连接employees表和b表
SELECT e.last_name, e.first_name, b.dept_name
FROM employees AS e
LEFT JOIN (SELECT *
FROM departments AS d
INNER JOIN dept_emp AS de
ON d.dept_no=de.dept_no
) AS b
ON e.emp_no=b.emp_no;

方法2:两次LEFT JOIN嵌套
SELECT last_name, first_name, dept_name
FROM (SELECT *
FROM employees
LEFT JOIN dept_emp
ON employees.emp_no=dept_emp.emp_no
) AS a
LEFT JOIN departments
ON a.dept_no=departments.dept_no;

SELECT em.last_name, em.first_name, dp.dept_name
FROM (employees AS em
LEFT JOIN dept_emp AS de
ON em.emp_no = de.emp_no)
LEFT JOIN departments AS dp
ON de.dept_no = dp.dept_no
注意:方法2中的2种子方法,主表是不同的。子方法1必须用AS a进行重命名,而且外面不能引用主表a中的连接子表employees或dept_emp。而子方法2的外面则可以引用主表中的连接子表。

方法3:两次LEFT JOIN连接
SELECT last_name, first_name, dept_name
FROM employees
LEFT JOIN dept_emp ON employees.emp_no=dept_emp.emp_no
LEFT JOIN departments ON dept_emp.dept_no=departments.dept_no;

全部评论
第一种方法错误
2 回复 分享
发布于 2021-01-29 20:21
请教大佬,我疑惑的地方有两点:(1)方法2中子方法1因为参与形成SELECT表所以连接的俩表不能再被引用吗?这是什么原理?(2)方法2中的子方法2与方法3执行过程是一致的吗?这俩方法在执行过程也形成了临时表吗?如果形成了我理解与(1)又一样了。感谢!
1 回复 分享
发布于 2020-07-04 21:57
第一个方法的select *会出现错误,因为有两个同名的列
22 回复 分享
发布于 2021-01-03 12:23
第一个方法改一下: select e.last_name, e.first_name, c.dept_name from employees e left join ( select de.emp_no, de.dept_no, d.dept_name from dept_emp de inner join departments d on de.dept_no=d.dept_no)as c on e.emp_no=c.emp_no;
7 回复 分享
发布于 2021-06-19 00:32
只要是不加dept_emp.to_date='9999-01-01' 都是有缺陷的,如果部门关系表中一个员工有多条数据:即在不同的时间段分配了不同的部门。。。
4 回复 分享
发布于 2021-09-13 16:41
2.2和3就是一个东西
2 回复 分享
发布于 2021-12-25 22:23
SELECT e.last_name,e.first_name,d1.dept_name from employees e left join dept_emp d on d.emp_no=e.emp_no left join departments d1 on d1.dept_no=d.dept_no;
2 回复 分享
发布于 2021-07-28 09:59
我自己写的和博主写的方法二一模一样,但是我的出现了数组越界或方法名不对的error,然后复制楼主的发现也是一样出现这个error,但是第三个却没有问题,很怪,有没有大佬知道这个error出现的原因啊
1 回复 分享
发布于 2024-09-08 17:40 浙江
就是套娃题吗
点赞 回复 分享
发布于 2022-09-27 22:01 山西
第一条也可以用using来去重复列 select e.last_name,e.first_name,a.dept_name from employees as e left join (select * from dept_emp as d inner join departments as dp using (dept_no))as a on e.emp_no = a.emp_no;
点赞 回复 分享
发布于 2022-04-13 11:15
我也是在mysql上 第一个方法一定要把同名的列解决才行
点赞 回复 分享
发布于 2021-10-23 21:58
就想知道你们一道题做了多久?
点赞 回复 分享
发布于 2021-10-04 22:15
第一个错了
点赞 回复 分享
发布于 2021-03-29 19:10

相关推荐

我就是0offer糕手:北大不乱杀
点赞 评论 收藏
分享
评论
92
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务