如何在SQL中实现单个列与多个列的多次关联?
解决多字段关联与行展开的SQL问题
先明确下你的数据源和需求:
现有数据表
t1表(关联关系表)
| parent | main | child |
|---|---|---|
| A | B | NULL |
| B | C | NULL |
| NULL | C | D |
t2表(字母对应数值表)
| letter | num |
|---|---|
| A | 1 |
| A | 2 |
| B | 7 |
| C | 12 |
| D | 14 |
期望输出
| parent | parent_num | main | main_num | child | child_num |
|---|---|---|---|---|---|
| A | 1 | B | 7 | NULL | NULL |
| A | 2 | B | 7 | NULL | NULL |
| B | 7 | C | 12 | NULL | NULL |
| NULL | NULL | C | 12 | D | 14 |
解决方案
其实你不需要用到UNION ALL,核心思路是对t2表进行多次左连接,每次连接对应t1里的一个字段,给每次连接的t2起不同别名区分即可。直接看代码:
SELECT t1.parent, t2_parent.num AS parent_num, t1.main, t2_main.num AS main_num, t1.child, t2_child.num AS child_num FROM t1 LEFT JOIN t2 AS t2_parent ON t1.parent = t2_parent.letter LEFT JOIN t2 AS t2_main ON t1.main = t2_main.letter LEFT JOIN t2 AS t2_child ON t1.child = t2_child.letter
思路解释
- 多别名左连接:把
t2表分别以t2_parent、t2_main、t2_child的别名连接到t1上,分别对应parent、main、child三个字段与t2.letter的关联,这样就能一次性拿到每个字母对应的数值。 - 自动行展开:当
t2里同一个字母有多个数值时(比如A对应1和2),左连接会自动把t1中对应的行(第一行A-B-NULL)展开成两行,正好匹配你要的输出。 - NULL值处理:用
LEFT JOIN而不是INNER JOIN,保证当t1里的字段为NULL时(比如第四行的parent),对应的_num字段也会显示NULL,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ricardo Francois
相关产品推荐
相关产品推荐

