繁体   English   中英

合并条件然后更新

[英]MERGE Conditional THEN UPDATE

我有两个表:Master 和 Source。 两个表都有 3 列。 它们是 ID、项目描述和标价。 “源”表在项目描述中有一些空值。

我想要做的是将源表合并到主表中。 但是,如果源表中的描述字段为空,则不要更改主表中的描述。

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

    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)

你应该得到一个错误,看起来像:

消息 10714,级别 15,状态 1,行 类型为“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”

在这种特殊情况下,正如 Karl Kieninger 在他的回答中所解释的那样,您的WHEN MATCHED子句真的可以非常简单地合并为一个子句。 但是,如果您的两个WHEN MATCHED子句根据您使用的谓词而有很大不同,那么您可以模拟标准 SQL 使用多个WHEN MATCHED子句的能力, 就像我在这篇博文中所展示的那样

例如,如果你想做这样的事情(其中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

然后,您必须使用CASE表达式和p1p2p3p4上的组合将上述内容重写为以下一组WHEN MATCHED子句

WHEN MATCHED AND
  p1 OR
  NOT p1 AND NOT p2 AND p3
THEN UPDATE SET
  c1 = CASE
    WHEN p1                       THEN 1
    WHEN NOT p1 AND NOT p2 AND p3 THEN 3
                                  ELSE c1
  END,
  c2 = CASE
    WHEN NOT p1 AND NOT p2 AND p3 THEN 3
                                  ELSE c2
  END
WHEN MATCHED AND
  NOT p1 AND p2 OR
  NOT p1 AND NOT p2 AND NOT p3 AND p4
THEN DELETE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM