如何合并共享id参考列且包含独立列的表格,实现同id下记录数较少的列对应单元格留空?
实现按id分组的列对齐拼接需求
首先先明确你的源表和期望输出:
源表1 (First Table)
| id | f1 |
|---|---|
| 1 | a |
| 1 | b |
| 2 | c |
| 3 | d |
| 3 | e |
源表2 (Second Table)
| id | f2 |
|---|---|
| 1 | k |
| 2 | m |
| 2 | n |
| 3 | p |
期望结果
| id | f1 | f2 |
|---|---|---|
| 1 | a | k |
| 1 | b | |
| 2 | c | m |
| 2 | n | |
| 3 | d | p |
| 3 | e |
要实现这个效果,核心思路是给每个id分组内的记录分配行号,然后基于id+行号做全连接,这样就能让同id同位置的记录对齐,行数少的列自然会出现空值。下面是标准SQL的实现方案:
WITH first_table_with_row AS ( SELECT id, f1, ROW_NUMBER() OVER (PARTITION BY id ORDER BY f1) AS row_num FROM first_table ), second_table_with_row AS ( SELECT id, f2, ROW_NUMBER() OVER (PARTITION BY id ORDER BY f2) AS row_num FROM second_table ) SELECT COALESCE(t1.id, t2.id) AS id, t1.f1, t2.f2 FROM first_table_with_row t1 FULL OUTER JOIN second_table_with_row t2 ON t1.id = t2.id AND t1.row_num = t2.row_num ORDER BY id, COALESCE(t1.row_num, t2.row_num);
代码解释:
- CTE生成带行号的表:用
ROW_NUMBER()窗口函数,按id分组,给每个分组内的记录分配递增的行号(排序字段可以根据你的实际需求调整,这里用f1/f2排序)。 - 全连接关联:使用
FULL OUTER JOIN,关联条件是id相同且row_num相同,这样两个表中同id同行号的记录会匹配在一起,某表没有对应行号的记录就会显示空值。 - 排序与结果整理:用
COALESCE处理id和行号的空值,最后按id和行号排序,得到你要的结果。
如果是在特定数据库(比如MySQL 8.0+、SQL Server等),语法可能略有差异,但核心逻辑是一致的。
内容的提问来源于stack exchange,提问作者user16049828
相关产品推荐
相关产品推荐

