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 【问题描述】:我在两个数据库(dbSource
和 dbTarget
)中有同一个表,我正在尝试编写一个查询来将每个表中的字段值与源/目标差异进行比较。
这是表结构:
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
设置一行是没有意义的(源值和目标值始终相同) .
【讨论】:
是的,这正是我要找的。谢谢! 只有在dbSource
和dbTarget
之后使用.dbo
才能使其与原始示例一起使用。以上是关于SQL Server - 使用 PIVOT 查询比较 2 个表中的字段的主要内容,如果未能解决你的问题,请参考以下文章
将 Access TRANSFORM/PIVOT 查询转换为 SQL Server
具有 group by 和/或 distinct 和 pivot 的复杂 SQL Server 查询