Oracle SQL Join查询问题:实现员工ID关联的姓名映射输出
解决Oracle SQL关联查询的姓名匹配问题
嘿,我来帮你搞定这个查询问题!你之前用OR关联两张表的方式会导致每条tbl_from_to记录和tbl_emp匹配两次(一次匹配col_from,一次匹配col_to),这就是为什么结果里的姓名会重复的原因。
正确的思路是两次关联员工表,分别对应col_from和col_to的编码,给员工表取不同的别名来区分两次关联,这样就能精准拿到对应的姓名了。
正确的SQL语句
SELECT emp_from.name AS res_from, emp_to.name AS res_to FROM tbl_from_to ft JOIN tbl_emp emp_from ON ft.col_from = emp_from.emp_code JOIN tbl_emp emp_to ON ft.col_to = emp_to.emp_code;
语句解释
- 给
tbl_emp表分别取别名emp_from和emp_to,代表“来源员工”和“目标员工” - 第一次
JOIN关联tbl_from_to.col_from和emp_from.emp_code,获取来源员工的姓名 - 第二次
JOIN关联tbl_from_to.col_to和emp_to.emp_code,获取目标员工的姓名
执行这条语句后,你就能得到期望的结果:
| res_from | res_to |
|---|---|
| D | B |
| A | B |
| B | C |
| C | D |
可选:处理不存在的员工记录
如果tbl_from_to里的col_from或col_to可能没有对应的员工记录(比如编码无效),可以把JOIN换成LEFT JOIN,这样即使没有匹配的员工,也会保留tbl_from_to的记录,对应的姓名会显示为NULL:
SELECT emp_from.name AS res_from, emp_to.name AS res_to FROM tbl_from_to ft LEFT JOIN tbl_emp emp_from ON ft.col_from = emp_from.emp_code LEFT JOIN tbl_emp emp_to ON ft.col_to = emp_to.emp_code;
内容的提问来源于stack exchange,提问作者Miracle




