SQL如何关联遗留组表与员工主表获取各岗位人员详细信息
遗留表结构的关联查询实现方案
核心思路
组表的Manager、TL、Architect字段各自存了不同岗位的员工emp_id,没法通过一次关联就匹配到所有人员信息,所以需要对员工主表做三次独立的定向关联,每次关联分别匹配一个岗位的ID值,通过别名区分不同岗位的结果,完全适配现有不可修改的表结构,不需要做任何表侧的调整。
可直接使用的SQL代码
关键提醒:
Group是SQL语法保留关键字,写SQL的时候一定要根据所用数据库做转义(MySQL用反引号、SQL Server用方括号、PostgreSQL用双引号),否则会直接报语法错误。
SELECT -- 组基础信息 g.`Group` AS group_id, -- 经理岗的全量信息 g.Manager AS manager_emp_id, e_mgr.Name AS manager_name, e_mgr.Address AS manager_address, -- TL岗的全量信息 g.TL AS tl_emp_id, e_tl.Name AS tl_name, e_tl.Address AS tl_address, -- 架构师岗的全量信息 g.Architect AS architect_emp_id, e_arch.Name AS architect_name, e_arch.Address AS architect_address FROM 组表 g -- 用左连接匹配,避免某岗位的员工信息缺失(比如员工离职没同步)时,丢失整行组的记录 LEFT JOIN 员工主表 e_mgr ON g.Manager = e_mgr.Emp_id LEFT JOIN 员工主表 e_tl ON g.TL = e_tl.Emp_id LEFT JOIN 员工主表 e_arch ON g.Architect = e_arch.Emp_id
示例数据匹配结果
针对给出的测试数据,执行上面的SQL会返回完整的关联结果:
| group_id | manager_emp_id | manager_name | manager_address | tl_emp_id | tl_name | tl_address | architect_emp_id | architect_name | architect_address |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 256 | Rick | Bombay | 455 | Dennis | Madras | 339 | Harry | Denver |
实操注意事项
- 如果可以确认所有岗位的emp_id在员工主表中一定存在、没有缺失值,也可以把
LEFT JOIN换成INNER JOIN,查询性能会略有提升;只要存在数据缺失的可能性,优先用左连接,保证基础的组记录不丢。 - 这种三次定向关联的写法是这个场景下逻辑最清晰、查询性能最优的实现,不需要用UNION或者笛卡尔积之类的复杂写法,减少不必要的性能开销。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

