0

ステージング テーブルに 100 万行を超える行があります。毎月ステージング テーブルが行を取得し、マスター テーブルに挿入した後、ステージング内のそれらの行は削除されます。

allchangesマスターテーブルに加えられたすべての更新を追跡する別のテーブルが呼び出されます (たとえば、月 1 の住所の変更、月 2 の電話の変更など、すべての変更には 2 つのレコードがあります) が、マスターには更新されたレコードが 1 つしかありません。

、とを使用MERGEしました。when matchedwhen not matched by targetwhen 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 行のアクティブをゼロに設定します。どうすればこれを克服できますか??

4

0 に答える 0