如何高效将宽表转为键值对?求助Unpivot缺失RecordId问题
解决SQL Unpivot扁平化宽表时缺失RecordId的问题
你的问题出在两个关键错误上:
- 错误地将
RecordId纳入了Unpivot需要转换的列列表中,导致它被拆成键值对而非作为每条记录的标识保留 - 外层查询没有选择
RecordId列
正确的Unpivot写法需要把RecordId作为非转换列保留,只对其他需要扁平化的列进行Unpivot操作。以下是修正后的代码:
select RecordId, [Key], [Value] from ( SELECT RecordId, FirstName, LastName, Country, Grade FROM test ) src unpivot ( [Value] for [Key] in ([FirstName],[LastName], [Country], [Grade]) ) unpvt
代码说明:
- 子查询
src明确指定保留RecordId,仅包含需要转换为键值对的列 - Unpivot的
in列表仅包含需要扁平化的列(排除RecordId),这样RecordId会被自动复制到每一行结果中 - 外层查询同时选择
RecordId、Key和Value,完全匹配你的目标表结构
这个写法是集合式操作,性能远优于游标逐行迭代的方式,能高效完成宽表扁平化的需求。
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

