微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server-使用PIVOT查询比较2个表中的字段

如何解决SQL Server-使用PIVOT查询比较2个表中的字段

我在两个数据库dbSourcedbTarget)中有相同的表,并且我试图编写一个查询以将每个表中的字段值与Source / Target diff进行比较。

这是表结构:

CREATE TABLE [dbo].[tblWidget](
    [ID] [int] NOT NULL,[Description] [varchar](50) NOT NULL,[UpdatedBy] [varchar](50) NOT NULL,CONSTRAINT [PK_tblWidget] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,IGnorE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON,OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

为简单起见,我将说每个数据库中的表都有一行:

[dbSource]

Source DB record

[dbTarget]

Target DB record

我希望结果看起来像这样:

Expected Result

与结果最接近的是一个PIVOT查询,该查询仅返回一个字段(UpdatedBy)。 有没有一种简单的方法可以在一个查询中包含所有字段,而不是通过多个UNION语句来进行某种PIVOT

我意识到如果有多个行(例如:ID = 2的行),则预期的结果将是没有意义的,因此请假设我只会在数据库之间比较一行。

这是我到目前为止所拥有的:

SELECT 'UpdatedBy' Field,[0] AS [Source],[1] AS [Target]
FROM
(
SELECT [ID],[Description],[UpdatedBy],1 IsSource
FROM [dbSource].[dbo].[tblWidget]
UNION ALL 
SELECT [ID],0 IsSource
FROM [dbTarget].[dbo].[tblWidget]
) a
PIVOT (
    MAX(UpdatedBy)
    FOR IsSource IN ([0],[1])
) AS pvt

谢谢

解决方法

您可以将两个表连接起来,然后将列取消透视成行:

id

这假设列select s.id,x.* from dbsource.tblWidget s inner join dbtarget.tblWidget t on t.id = s.id cross apply (values ('Description',s.description,t.description),('UpdatedBy',s.updatedby,t.updatedby) ) x (field,source,target) 可用于关联两个表-结果,在结果中为id设置一行是没有意义的(源值和目标值始终一样)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。