[英]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
子句的能力, 就像我在这篇博文中所展示的那样。
例如,如果你想做这样的事情(其中p1
、 p2
、 p3
、 p4
是一些谓词):
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
表达式和p1
、 p2
、 p3
、 p4
上的组合将上述内容重写为以下一组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.