You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于前缀对SQL查询结果逆透视,实现同表两行数据对比?

实现SQL Server两行数据按字段分组的窄表对比

方法一:使用UNION ALL(字段较少时推荐)

这种方式逻辑直观,直接将每个字段拆分为单独行返回:

SELECT 'Addressee' AS Field, OLD.[Addressee] AS OLD, NEW.[Addressee] AS NEW
FROM [dbo].[Location] OLD, [dbo].[Location] NEW
WHERE OLD.[ID] = 590230 AND NEW.[ID] = 1
UNION ALL
SELECT 'BuildingName' AS Field, OLD.[BuildingName] AS OLD, NEW.[BuildingName] AS NEW
FROM [dbo].[Location] OLD, [dbo].[Location] NEW
WHERE OLD.[ID] = 590230 AND NEW.[ID] = 1

方法二:使用UNPIVOT(字段较多时推荐)

通过UNPIVOT转换宽表结构,减少重复的查询条件,适合字段数量较多的场景:

WITH CTE AS (
    SELECT 
        OLD.[Addressee] OLD_Addressee, NEW.[Addressee] NEW_Addressee, 
        OLD.[BuildingName] OLD_BuildingName, NEW.[BuildingName] NEW_BuildingName
    FROM [dbo].[Location] OLD, [dbo].[Location] NEW
    WHERE OLD.[ID] = 590230 AND NEW.[ID] = 1
)
SELECT 
    REPLACE(OLD_Field, 'OLD_', '') AS Field,
    OLD_Value AS OLD,
    NEW_Value AS NEW
FROM CTE
UNPIVOT (OLD_Value FOR OLD_Field IN (OLD_Addressee, OLD_BuildingName)) AS UP1
JOIN CTE
UNPIVOT (NEW_Value FOR NEW_Field IN (NEW_Addressee, NEW_BuildingName)) AS UP2
ON REPLACE(UP1.OLD_Field, 'OLD_', '') = REPLACE(UP2.NEW_Field, 'NEW_', '')

两种方法均可输出你需要的窄表格式:

FieldOLDNEW
AddresseetestNULL
BuildingNameBuil1Buil2

内容的提问来源于stack exchange,提问作者Meg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:18:27