有一个员工表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 10002和10003本身都是经理
时间: 2023-06-12 08:05:39 浏览: 88
可以使用子查询和LEFT JOIN来实现此需求:
```
SELECT e.emp_no, IFNULL(m.emp_no, 'No manager') AS manager
FROM dept_emp e
LEFT JOIN (
SELECT dm.dept_no, dm.emp_no
FROM dept_manager dm
WHERE dm.from_date <= NOW() AND dm.to_date > NOW()
) m ON e.dept_no = m.dept_no AND e.emp_no != m.emp_no
ORDER BY e.emp_no;
```
解释:
1. 子查询 `SELECT dm.dept_no, dm.emp_no FROM dept_manager dm WHERE dm.from_date <= NOW() AND dm.to_date > NOW()` 用于查询当前时间范围内的部门经理。
2. 使用 LEFT JOIN 将员工表(`dept_emp`)与经理表(`dept_manager`)连接起来,条件为员工所在部门相同且员工不是经理自己(因为题目要求不显示员工本身是经理的情况),这里使用 `e.emp_no != m.emp_no` 来排除自己是自己经理的情况。
3. 使用 IFNULL 函数将 `NULL` 值(即没有经理的员工)替换为 "No manager"。
4. 最后按照员工编号排序。
阅读全文