我有兩列的表,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
子句拾取。
我不確定你的主要語法,正如你所說,如果更新是非deterministic.so,而不是試圖解決它,如果你還想繼續並更新..你可以使用派生表這將只有一場比賽 – TheGameiswar
對不起,我不完全得到您的意見。如果一行將被更新爲會在表中衝突的內容,那麼我想要刪除該行。 但是,如果碰撞是由合併步驟中的先前更新生成的,那麼我的'EXISTS'條件將不會找到它。有沒有更好的條件可以用來解決這個問題? – skeletalmonkey
您可以請您與您正在談論的兩個表格的一些樣本數據共享表格架構,以便我們更好地理解這兩個表格之間的關係。 –