簡體   English   中英

SQL Server - 使用 PIVOT 查詢比較 2 個表中的字段

[英]SQL Server - Compare Fields in 2 Tables with PIVOT query

我在兩個數據庫( 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

謝謝

您可以連接兩個表,然后將列反透視為行:

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設置一行是沒有意義的(源值和目標值始終相同)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM