基于列值筛选合并数据表,是否属于Pivot操作?
解决方案
这确实属于**Pivot(行转列)**操作,下面给你两种实用的实现方式:
1. 通用CASE WHEN写法(适配绝大多数数据库)
这种写法不依赖数据库特定语法,兼容性拉满:
SELECT m.ID, m.data, MAX(CASE WHEN a.key = 'apple' THEN a.value END) AS apple, MAX(CASE WHEN a.key = 'orange' THEN a.value END) AS orange FROM 主表 m LEFT JOIN 附加信息表 a ON m.ID = a.ID AND a.key IN ('apple', 'orange') -- 提前过滤不需要的key,减少计算量 GROUP BY m.ID, m.data;
逻辑拆解:
- 用
LEFT JOIN确保主表所有记录都保留,没有匹配的附加信息自动显示NULL - 通过
CASE WHEN把key列的取值映射为对应列名,用MAX聚合(因为每个ID+key唯一,MIN也可以)合并行数据 - 提前过滤
pear这类不需要的key,提升查询效率
2. 数据库原生PIVOT语法(以SQL Server为例)
如果你的数据库支持原生PIVOT(比如SQL Server、Oracle、PostgreSQL 11+),可以用更简洁的写法:
SELECT p.ID, p.data, p.apple, p.orange FROM ( -- 先筛选出需要的key,避免PIVOT处理冗余数据 SELECT m.ID, m.data, a.key, a.value FROM 主表 m LEFT JOIN 附加信息表 a ON m.ID = a.ID AND a.key IN ('apple', 'orange') ) AS source PIVOT ( MAX(value) -- 聚合函数,这里用MAX是因为每个ID+key对应唯一值 FOR key IN ([apple], [orange]) -- 指定要转成列的key值 ) AS p;
最终结果:
执行任意一种SQL,都会得到你想要的结果:
| ID | data | apple | orange |
|---|---|---|---|
| 1 | bla | 5 | 3 |
| 2 | blubb | 4 | NULL |
内容的提问来源于stack exchange,提问作者WilliamEllisWebb
相关产品推荐
相关产品推荐

