SQL 服务器 - 使用 PIVOT 查询比较 2 个表中的字段
SQL Server - Compare Fields in 2 Tables with PIVOT query
我在两个数据库(dbSource
和 dbTarget
)中有相同的 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
行没有意义(源和目标)值总是相同的)。
我在两个数据库(dbSource
和 dbTarget
)中有相同的 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
行没有意义(源和目标)值总是相同的)。