SQL11 获取所有员工当前的manager

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 中,ONWHERE 的区别

  • INNER JOIN:条件放在 ON 和 WHERE 的效果一样
  • LEFT JOIN ,ON 是对右表的限制,而不对 左表进行限制!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值