如果键冲突则删除行的SQL Update语句

时间:2016-04-21 08:52:59

标签: sql sql-server tsql

我有一个表有两列Hotel_Guest_ID和Guest_ID,用于将访客记录链接到该访客的酒店详细信息。该表具有每对需要唯一的约束。

我现在有了第二个Prime_ID和Duplicate_ID表,它是在清理重复的Guest表后生成的。我想通过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通常已经有一个特定Guest的记录,此时我想删除这一行而不是更新它。

有没有一种很好的方法可以在一次传递中执行此操作,或者我是否必须首先删除潜在的冲突行,然后在第二次查询中更新?

1 个答案:

答案 0 :(得分: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);