2016-04-25 90 views
1

我有兩列的表,Prime_GuestID和Dup_GuestID以表示GuestID的和ID(一個或多個)替換(重複記錄)之間的聯繫對SQL合併Update語句避免按鍵衝突

現在我想通過格式的其他一些關係表並將任何出現的Dup_GuestID更新爲Prime_GuestID。

但是,如果Prime_GuestID已經有一個給定的ThingID的條目,那麼我需要從關係表中刪除該行。

目前我正在使用下面的腳本,儘管它適用於大多數情況下,如果兩個Dup_GuestID更新到給定的ThingID的Prime_GuestID相同,它將失敗。似乎合併語句在創建它們之前將所有更改排隊,因此我的衝突檢查不會檢測到它們。

MERGE Thing_Relation AS t 
USING Guest_Relation AS g 
    ON t.GuestID = g.Dup_GuestID 
WHEN MATCHED AND EXISTS ( -- Clash Check here 
         select * 
         from Thing_Relation AS t2 
         where t2.ThingID = t.ThingID 
         and t2.GuestID = g.Prime_GuestID 
         ) 
THEN DELETE 
WHEN MATCHED 
THEN UPDATE SET t.GuestID = g.Prime_GuestID 

有沒有更好的方法可以在'匹配並存在'時檢查檢查這種合併導致的衝突?還是有更好的方法來做這件事?

編輯:這裏是表

Thing_Relation   Guest_Relation 
ThingID | GuestID  Prime_GuestID | Dup_GuestID 
------------------  --------------------------- 
1  | 101      101 | 102 
1  | 102      107 | 104 
2  | 103      107 | 105 
3  | 104 
3  | 105 

Thing_Relation after merge 
ThingID | GuestID  
------------------  
1  | 101    
2  | 103 
3  | 107  

的1一些示例數據|已經存在這樣的行被刪除101 | 102被改變爲1。 2 | 103不受影響 3 | 104更改爲3 | 107,並且由於3 | 105也更改爲3 | 107,但上一次更新尚未發生,因此不由EXISTS子句拾取。

+0

我不確定你的主要語法,正如你所說,如果更新是非deterministic.so,而不是試圖解決它,如果你還想繼續並更新..你可以使用派生表這將只有一場比賽 – TheGameiswar

+0

對不起,我不完全得到您的意見。如果一行將被更新爲會在表中衝突的內容,那麼我想要刪除該行。 但是,如果碰撞是由合併步驟中的先前更新生成的,那麼我的'EXISTS'條件將不會找到它。有沒有更好的條件可以用來解決這個問題? – skeletalmonkey

+0

您可以請您與您正在談論的兩個表格的一些樣本數據共享表格架構,以便我們更好地理解這兩個表格之間的關係。 –

回答

0

你說得對,MERGE不會對MERGE語句本身所做的更改執行檢查。這是MERGE的基本屬性。幾個選項可能是:

  1. 在UPDATE上創建一個TRIGGER,它將繼續檢查每個更新的衝突並刪除重複的行。 OR
  2. 只需爲UPDATE寫一條不同的語句,稍後再寫一條DELETE來重複條目。