问题描述
我在两个数据库(dbSource
和dbTarget
)中有相同的表,并且我试图编写一个查询以将每个表中的字段值与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]
:
[dbTarget]
:
我希望结果看起来像这样:
与结果最接近的是一个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
设置一行是没有意义的(源值和目标值始终一样)。