如何基于指定列关联拼接多个SQL查询的输出结果?
关联查询结果与转置键值表的SQL解决方案
一、基础场景:合并两个查询结果
现有以下两个查询及对应的输出,需要以id为公共列合并结果,保留所有id,缺失的列值显示NULL。
查询1及输出
Select id,first_name,middle_name from table1 where id < 4
输出1:
| id | first_name | middle_name |
|---|---|---|
| 1 | Linda | Marie |
| 2 | Mary | Alice |
| 3 | John | Steven |
查询2及输出
Select id,last_name from table2 where id < 4
(注:last_name为可选列,仅当有值时显示对应条目)
输出2:
| id | last_name |
|---|---|
| 1 | Jackson |
| 3 | Thomson |
解决方案
使用LEFT JOIN以第一个查询的id为基准关联两个结果,确保所有id都被保留:
SELECT t1.id, t1.first_name, t1.middle_name, t2.last_name FROM ( Select id,first_name,middle_name from table1 where id < 4 ) t1 LEFT JOIN ( Select id,last_name from table2 where id < 4 ) t2 ON t1.id = t2.id ORDER BY t1.id;
期望结果
| id | first_name | middle_name | last_name |
|---|---|---|---|
| 1 | Linda | Marie | Jackson |
| 2 | Mary | Alice | NULL |
| 3 | John | Steven | Thomson |
二、复杂场景:转置键值对表并关联
当数据源为键值对结构的表格时,需先转置为宽表再合并,以下是具体场景:
源表格数据
Table1
| id | Entry | Result |
|---|---|---|
| 1 | first_name | Linda |
| 2 | first_name | Mary |
| 3 | first_name | John |
| 1 | second_name | Liam |
| 2 | second_name | Violet |
| 3 | second_name | Charlotte |
Table2
| id | Entry | Result |
|---|---|---|
| 1 | middle_name | Marie |
| 2 | middle_name | Alice |
| 3 | middle_name | Steven |
| 1 | last_name | Jackson |
| 3 | last_name | Thomson |
解决方案
通过条件聚合将键值表转置为宽表,再用LEFT JOIN关联:
SELECT t1.id, t1.first_name, t2.middle_name, t2.last_name FROM ( -- 转置Table1提取first_name SELECT id, MAX(CASE WHEN Entry = 'first_name' THEN Result END) AS first_name FROM Table1 GROUP BY id ) t1 LEFT JOIN ( -- 转置Table2提取middle_name和last_name SELECT id, MAX(CASE WHEN Entry = 'middle_name' THEN Result END) AS middle_name, MAX(CASE WHEN Entry = 'last_name' THEN Result END) AS last_name FROM Table2 GROUP BY id ) t2 ON t1.id = t2.id ORDER BY t1.id;
期望结果
| id | first_name | middle_name | last_name |
|---|---|---|---|
| 1 | Linda | Marie | Jackson |
| 2 | Mary | Alice | NULL |
| 3 | John | Steven | Thomson |
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

