2012-08-13 67 views
1

我有兩個表:對排除行進行修改的Upsert?

表1

ID ColA ColB Status 

表2

ColA ColB 

我從表2表1試圖MERGE記錄的方式如下:

  1. 對於表2存在於表中的每一行1,我設置Status = 1
  2. 對於每一行中表2不存在於表1中,我插入一行到表1並設置Status = 1
  3. 對於每一行中表1不存在於表2,設置Status = 0

在一個聲明中可以這樣做嗎?目前,我能夠實現12但我不知道怎麼去第三個還有:

MERGE INTO dbo.Table1 WITH(HOLDLOCK) AS Target 
USING dbo.Table2 AS Source 
ON Target.ColA = Source.ColA AND Target.ColB = Source.ColB 
WHEN MATCHED THEN 
    UPDATE SET Target.Status = 1 
WHEN NOT MATCHED THEN 
    INSERT (ColA, ColB, Status) VALUES(Source.ColA, Source.ColB, 1); 

如何實現在同一個語句3有什麼建議?

回答

1

你想要「NOT MATCHED BY SOURCE」子句。

MERGE INTO dbo.Table1 WITH(HOLDLOCK) AS Target 
USING dbo.Table2 AS Source 
ON Target.ColA = Source.ColA AND Target.ColB = Source.ColB 
WHEN MATCHED THEN 
    UPDATE SET Status = 1 
WHEN NOT MATCHED THEN 
    INSERT (ColA, ColB, Status) VALUES(Source.ColA, Source.ColB, 1) 
WHEN NOT MATCHED BY SOURCE THEN 
    UPDATE SET Status = 0 
; 
+0

+1太棒了!謝謝你的時間... – Legend 2012-08-13 03:28:37

+0

有一段時間,我認爲'NOT MATCHED BY SOURCE'中的'SOURCE'是'Source'別名!以防萬一,其他任何人都面臨這樣的問題 - 「不匹配SOURCE」是一個內置表達式。 – Legend 2012-08-13 08:51:22