合并条件然后更新

时间:2014-04-20 02:06:07

标签: sql sql-server-2008 tsql

我有两张桌子:Master和Source。两个表都有3列。它们是ID,项目描述和清单价格。 '来源' table在Item Description中有一些空值。

我想要做的是将Source表合并到Master中。但是,如果Source表中的description字段为null,则不要更改Master表中的描述。

有没有更好的方法重写这个?它看起来有点重复。这是我的尝试。

    Breakdown:
    1) When matched and if description in source is null, only update id 
       and price
    2) When matched update
    3) Insert into Master table if Source table has new ids



MERGE INTO MASTER AS MS
USING       SOURCE AS SRC
ON        (MS.id = SRC.id)
WHEN MATCHED AND SRC.item_deSRC is NULL THEN
UPDATE SET MS.id = SRC.id
           MS.List_Price = SRC.List_Price
WHEN MATCHED THEN
UPDATE SET MS.id = SRC.id
,          MS.Description = SRC.Description
,          MS.List_Price = SRC.List_Price
WHEN NOT MATCHED THEN
INSERT VALUES(MS.id, MS.description, MS.List_Price)

2 个答案:

答案 0 :(得分:2)

这样做会出现错误,如下所示:

Msg 10714,Level 15,State 1,Line “WHEN MATCHED”类型的操作在MERGE语句的“UPDATE”子句中不能出现多次。

而不是

WHEN MATCHED AND SRC.item_deSRC is NULL THEN
UPDATE SET MS.id = SRC.id
           MS.List_Price = SRC.List_Price
WHEN MATCHED THEN
UPDATE SET MS.id = SRC.id
,          MS.Description = SRC.Description
,          MS.List_Price = SRC.List_Price

WHEN MATCHED THEN
UPDATE SET MS.Description = ISNULL(SRC.Description,MS.Description)
          ,MS.List_Price = SRC.List_Price

这应该是正确的,不那么重复,并且删除无关的“SET MS.id = SRC.id”

答案 1 :(得分:0)

在这种情况下,您的WHEN MATCHED子句实际上可以非常简单地合并到一个子句as Karl Kieninger explained in his answer中。但是,如果两个WHEN MATCHED子句根据所使用的谓词而有很大不同,则可以模拟标准SQL使用多个as I've also shown in this blog post这样的WHEN MATCHED子句的能力。 / p>

例如,如果您想做这样的事情(其中p1p2p3p4是一些谓词):

WHEN MATCHED AND p1 THEN UPDATE SET c1 = 1
WHEN MATCHED AND p2 THEN DELETE
WHEN MATCHED AND p3 THEN UPDATE SET c1 = 3, c2 = 3
WHEN MATCHED AND p4 THEN DELETE

然后,您必须使用WHEN MATCHEDCASE,{{1}上的p1表达式和组合将以上内容重写为以下p2子句集},p3

p4