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

SQL Server - Compare Fields in 2 Tables with PIVOT query

我在两个数据库(dbSourcedbTarget)中有相同的 table,我正在尝试编写一个查询来比较每个 [=52= 中的字段值] Source/Target 差异

这是table结构:

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

为简单起见,我会说每个数据库中的 table 有一行:

[dbSource]:

[dbTarget]:

我希望结果如下所示:

我能得到的最接近结果的是 PIVOT 查询,其中只有 returns 个字段 (UpdatedBy)。 有没有一种简单的方法可以将所有字段包含在一个查询中,而不是使用多个 PIVOT 语句执行某种 UNION

我意识到如果有不止一行(例如: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]
      ,[Description]
      ,[UpdatedBy]
      ,0 IsSource
FROM [dbTarget].[dbo].[tblWidget]
) a
PIVOT (
    MAX(UpdatedBy)
    FOR IsSource IN ([0], [1])
) AS pvt

谢谢

您可以连接两个表,然后将列逆透视为行:

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 可用于关联两个表 - 因此,在结果中包含 id 行没有意义(源和目标)值总是相同的)。