2016-04-21 62 views
0

我有一個表有兩個列Hotel_Guest_ID和Guest_ID,將客人記錄鏈接到該客人的酒店詳細信息。該表具有每個對都必須是唯一的約束。SQL更新語句,刪除行,如果鍵衝突

我現在有第二個Prime_ID和Duplicate_ID表,它是在清理重複客戶表後生成的。我想查看Booking表,如果找到Hotel.Guest_ID爲Duplicate_ID,然後用Prime_ID替換它。

update b 
set h.Guest_ID = gd.Prime_ID 
from Hotel as h 
join Guest_Duplicates as gd 
on h.Guest_ID = gd.Duplicate_ID 

但是這個失敗經常一個Prime_ID已經與特定的客戶記錄,在這一點上,我想只刪除此行,而不是更新它。

有沒有一種很好的方法來做到這一點,或者我必須先刪除潛在的衝突行,然後在第二個查詢中更新?

回答

3

你在找什麼是MERGE聲明。您可以使用單個語句插入,更新和刪除。這裏是一個例子 -

MERGE Table1 AS t1 
USING Table2 AS t2 
    ON t1.GuestID = t2.DuplicateID 
WHEN MATCHED AND (any condition) 
THEN DELETE 
WHEN MATCHED 
THEN UPDATE SET (assign statement) 
WHEN NOT MATCHED 
THEN 
     INSERT(column names) 
     VALUES(values to be inserted); 
+0

雖然你需要設置只有在更新衝突時纔會刪除的條件? – skeletalmonkey

+0

使用'當匹配和存在(檢查衝突)'。 – freakyhat

+0

所以實際上這是行不通的。問題是merge語句可能更新一個值,然後與另一行的更新衝突。雖然合併似乎先排列變化然後再應用它們,但我不知道要使用什麼條件來檢查早期合併步驟中可能發生的衝突 – skeletalmonkey