如何从关联表中获取正确信息?需查询员工姓名及其直属经理列表
获取员工姓名及直属经理列表的实现方案
嘿,我来帮你搞定这个需求!要拿到所有员工的姓名和他们的直属经理,核心是利用自连接(毕竟经理本身也是员工表中的一员),再结合部门与员工的关联关系。让我一步步拆解给你看:
理清表关联逻辑
先明确各表之间的关联点,避免写SQL时绕晕:
EMPLOYEE表:存储所有员工(包括经理)的核心信息,emp_nbr是员工唯一编号,emp_name是姓名字段。DEPT表:dept_nbr是部门编号,dept_mgr字段存的是该部门经理的emp_nbr——这是我们找到经理的关键。emp_dept表:员工与部门的中间关联表,通过emp_nbr和dept_nbr把员工和他所属的部门绑定在一起。
编写SQL查询
这里需要做三次关联,同时用左连接保证所有员工都能被查询到(哪怕有些员工没有部门或者没有直属经理)。直接上代码:
SELECT e.emp_name AS 员工姓名, m.emp_name AS 直属经理姓名 FROM EMPLOYEE e LEFT JOIN emp_dept ed ON e.emp_nbr = ed.emp_nbr LEFT JOIN DEPT d ON ed.dept_nbr = d.dept_nbr LEFT JOIN EMPLOYEE m ON d.dept_mgr = m.emp_nbr ORDER BY e.emp_name;
代码解释
- 用
e作为员工表的别名,m作为经理表的别名(因为是同一张表自连接,别名区分更清晰)。 - 第一个
LEFT JOIN:把员工和他所属的部门关联起来,拿到员工对应的部门编号。 - 第二个
LEFT JOIN:通过部门编号找到该部门的经理编号dept_mgr。 - 第三个
LEFT JOIN:用经理编号去员工表里匹配对应的经理姓名。 - 选择
LEFT JOIN而非INNER JOIN,是为了避免漏掉那些没有部门(比如公司创始人)或者没有直属经理的员工。
特殊场景处理
如果存在一个员工属于多个部门的情况,查询结果里会出现多条重复的员工记录。这时可以用DISTINCT来去重,或者根据业务规则筛选出员工的主部门:
SELECT DISTINCT e.emp_name AS 员工姓名, m.emp_name AS 直属经理姓名 FROM EMPLOYEE e LEFT JOIN emp_dept ed ON e.emp_nbr = ed.emp_nbr LEFT JOIN DEPT d ON ed.dept_nbr = d.dept_nbr LEFT JOIN EMPLOYEE m ON d.dept_mgr = m.emp_nbr ORDER BY e.emp_name;
内容的提问来源于stack exchange,提问作者Kendall O'Connor
相关产品推荐
相关产品推荐

