ステージング テーブルに 100 万行を超える行があります。毎月ステージング テーブルが行を取得し、マスター テーブルに挿入した後、ステージング内のそれらの行は削除されます。
allchanges
マスターテーブルに加えられたすべての更新を追跡する別のテーブルが呼び出されます (たとえば、月 1 の住所の変更、月 2 の電話の変更など、すべての変更には 2 つのレコードがあります) が、マスターには更新されたレコードが 1 つしかありません。
、とを使用MERGE
しました。when matched
when not matched by target
when not matched by source
WITH NewAndChanged
AS (SELECT TOP 2 stg.[EmpName],
stg.[EmpNumber],
FROM staging AS stg
ORDER BY stg.[EmpNumber]
EXCEPT
SELECT TOP 2 mas.[EmpName],
mas.[EmpNumber],
FROM [Master] AS mas
ORDER BY mas.EmpNumber)
MERGE INTO [Master]
AS Target
USING NewAndChanged AS Source ON Target.EmpNumber = Source.EmpNumber
WHEN MATCHED AND (COALESCE (Target.EmpName, '') <> COALESCE (Source.EmpName, '')
) THEN UPDATE
SET Target.EmpName = Source.EmpName,
WHEN NOT MATCHED BY TARGET THEN INSERT ([EmpName], [EmpNumber])
WHEN NOT MATCHED BY SOURCE AND Target.Active = 1 THEN UPDATE
SET Active = 0
output $action as act;
一度に 2 行しか選択していwhen not matched by source
ないため、2 回目の反復で最初の 2 行のアクティブをゼロに設定します。どうすればこれを克服できますか??