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

Posted

技术标签:

【中文标题】SQL Server - 使用 PIVOT 查询比较 2 个表中的字段【英文标题】:SQL Server - Compare Fields in 2 Tables with PIVOT query 【发布时间】:2020-09-19 00:59:20 【问题描述】:

我在两个数据库(dbSourcedbTarget)中有同一个表,我正在尝试编写一个查询来将每个表中的字段值与源/目标差异进行比较。

这是表结构:

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)。 有没有一种简单的方法可以在一个查询中包含所有字段,而不是使用多个 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

谢谢

【问题讨论】:

请使用文本,而不是图像/链接,以获取文本中的内容。请在代码问题中提供minimal reproducible example。 How to Askhelp center 【参考方案1】:

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

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 设置一行是没有意义的(源值和目标值始终相同) .

【讨论】:

是的,这正是我要找的。谢谢! 只有在dbSourcedbTarget之后使用.dbo才能使其与原始示例一起使用。

以上是关于SQL Server - 使用 PIVOT 查询比较 2 个表中的字段的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 动态 PIVOT 查询 - 字段顺序

将 Access TRANSFORM/PIVOT 查询转换为 SQL Server

具有 group by 和/或 distinct 和 pivot 的复杂 SQL Server 查询

SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

请教SQL server 中pivot的详细用法及语法规则

SQL Server中Pivot()函数实现动态行转列