如何创建SQL视图:将Location表ID替换为User表匹配邮箱
问题:将Location表的ID字段替换为对应邮箱创建视图
现有两张表:
- Location表字段:Location、Region、Senior_ID、Junior_ID、Manager_ID
- User表字段:Name、ID、Email
需求是创建一个视图,把Location表中的各类ID字段直接替换为User表中匹配ID对应的邮箱(不是新增列)。之前尝试用SELECT结合CASE WHEN语句,结果会生成新列,求可行的SQL实现方案。
Location表结构
| Location | Region | Senior_ID | Junior_ID | Manager_ID |
|---|---|---|---|---|
| 1 | ACB | xyz_123 | xyz_456 | |
| 2 | YJT | xyz_123 | xyz_456 | xyz_789 |
| 3 | HUP | xyz_456 | xyz_789 |
User表结构
| Name | ID | |
|---|---|---|
| Mark | xyz_123 | Mark@gmail.com |
| Toby | xyz_456 | Toby@gmail.com |
| Elena | xyz_789 | Elena@gmail.com |
期望视图结构
| Location | Region | Senior_mail | Junior_mail | Manager_mail |
|---|---|---|---|---|
| 1 | ACB | Mark@gmail.com | Toby@gmail.com | |
| 2 | YJT | Mark@gmail.com | Toby@gmail.com | Elena@gmail.com |
| 3 | HUP | Toby@gmail.com | Elena@gmail.com |
解决方案
使用**多次左连接(LEFT JOIN)**关联User表,分别匹配不同的ID字段,直接取出对应的邮箱并重命名为目标列名即可,不会生成多余列,同时保留原表的空值:
CREATE VIEW Location_Email_View AS SELECT l.Location, l.Region, u_senior.Email AS Senior_mail, u_junior.Email AS Junior_mail, u_manager.Email AS Manager_mail FROM Location l LEFT JOIN User u_senior ON l.Senior_ID = u_senior.ID LEFT JOIN User u_junior ON l.Junior_ID = u_junior.ID LEFT JOIN User u_manager ON l.Manager_ID = u_manager.ID;
说明
- 对User表做三次左连接,分别对应Senior_ID、Junior_ID、Manager_ID的匹配,确保每个ID都能关联到对应的邮箱
- 左连接(LEFT JOIN)可以保留Location表中ID为空的记录,对应邮箱列也会显示为空,符合需求
- 通过
AS关键字将Email字段重命名为目标列名,直接替换原ID列的位置,不会新增额外列
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

