如何用SQL关联多表,在同一行展示申请人、主管及审批人邮箱?
数据库查询需求与解决方案
现有表结构
现有三张数据库表:
USERS:存储所有用户数据,字段为ID、名、姓、邮箱;REQUESTS:存储用户提交的各类请求,字段为ID、申请人ID;DELEGATES:存储请求对应的主管和审批人ID,字段为ID、请求ID、主管ID、审批人ID。
关联关系:
- 申请人ID、主管ID、审批人ID均关联
USERS表的ID字段 - 请求ID关联
REQUESTS表的ID字段
当前问题
目前通过左连接REQUESTS与USERS、DELEGATES,已能获取申请人邮箱,但主管和审批人仍显示ID,需要编写SELECT与JOIN语句,实现将申请人、主管及审批人的邮箱在同一行展示,同时确认是否需要使用临时表。
表数据示例
USERS表
| ID | 名 | 姓 | 邮箱 |
|---|---|---|---|
| 1 | John | Doe | john.doe@test.com |
| 2 | Jane | Doe | jane.doe@test.com |
| 3 | Baby | Doe | baby.doe@test.com |
REQUESTS表
| ID | 申请人ID |
|---|---|
| A | 1 |
| B | 2 |
| C | 3 |
DELEGATES表
| ID | 请求ID | 主管ID | 审批人ID |
|---|---|---|---|
| x | A | 2 | 3 |
| y | B | 3 | 2 |
| z | C | 1 | 1 |
当前查询结果
| ID | 申请人邮箱 | 主管ID | 审批人ID |
|---|---|---|---|
| A | john.doe@test.com | 2 | 3 |
| B | jane.doe@test.com | 3 | 2 |
| C | baby.doe@test.com | 1 | 1 |
期望查询结果
| ID | 申请人邮箱 | 主管邮箱 | 审批人邮箱 |
|---|---|---|---|
| A | john.doe@test.com | jane.doe@test.com | baby.doe@test.com |
| B | jane.doe@test.com | baby.doe@test.com | jane.doe@test.com |
| C | baby.doe@test.com | john.doe@test.com | john.doe@test.com |
解决方案SQL语句
只需要多次关联USERS表即可,不需要临时表。具体SQL如下:
SELECT r.ID AS ID, u_app.email AS Applicant, u_sup.email AS Supervisor, u_appr.email AS Approver FROM REQUESTS r JOIN DELEGATES d ON r.ID = d.request_id JOIN USERS u_app ON r.applicant = u_app.ID JOIN USERS u_sup ON d.supervisor = u_sup.ID JOIN USERS u_appr ON d.approver = u_appr.ID;
说明
- 给
USERS表分别起三个别名:u_app(关联申请人)、u_sup(关联主管)、u_appr(关联审批人),通过不同关联条件获取对应邮箱。 - 若存在请求无对应
DELEGATES记录的情况,可将JOIN改为LEFT JOIN,避免丢失数据。 - 不需要使用临时表,直接多表关联就能实现需求,临时表反而会增加不必要的开销。
内容的提问来源于stack exchange,提问作者Cveka
相关产品推荐
相关产品推荐

