1. 题目
-
题目描述
获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示 -
表格
-
所需结果
2. 题解
2.1 表连接
方法:
① 确定连接字段:dept_no
② 使用INNER JOIN
③ 确定连接条件:emp_no 不同
使用emp_no互不相等这个条件,直接连接两个表。
SELECT de.emp_no, dm.emp_no manager
FROM dept_emp de
JOIN dept_manager dm
ON de.dept_no = dm.dept_no
WHERE de.emp_no != dm.emp_no
2.2 子查询
子查询采用更直接的方式进行解答:
# 子查询
SELECT emp_no,
(SELECT emp_no
FROM dept_manager
WHERE dept_emp.dept_no = dept_manager.dept_no)
FROM dept_emp
WHERE emp_no NOT IN (SELECT emp_no
FROM dept_manager)
注意到,这里使用子查询作为一个新的列。
反思:ON 字段的选择
虽然不难但刷第二遍时用了下面的复杂代码(能过):
(没有选对连接字段:先构造出不包含manager的员工表,再与manager 表格连接)
# 思路复杂了(连接字段选错)
SELECT t.emp_no, dm2.emp_no manager
FROM (SELECT de.emp_no, de.dept_no
FROM dept_emp de
LEFT JOIN dept_manager dm
ON de.emp_no = dm.emp_no
WHERE dm.dept_no IS NULL ) t
JOIN dept_manager dm2
ON t.dept_no = dm2.dept_no
以及下面的错误代码:
SELECT de.emp_no, dm.emp_no manager
FROM dept_emp de
LEFT JOIN dept_manager dm
ON de.emp_no = dm.emp_no
LEFT JOIN dept_manager dm2
ON de.dept_no = dm2.dept_no
WHERE dm.dept_no IS NULL # 这个条件属于第一次连接,不能放到后面的连接
附:JOIN 中,
ON
与WHERE
的区别:
- INNER JOIN:条件放在 ON 和 WHERE 的效果一样
- LEFT JOIN ,ON 是对右表的限制,而不对 左表进行限制!