如何在单个合并语句中执行多个更新

Posted

技术标签:

【中文标题】如何在单个合并语句中执行多个更新【英文标题】:How to perform multiple updates in single merge statement 【发布时间】:2019-10-16 00:11:20 【问题描述】:

我需要使用两个不同的条件更新单个合并语句中的多个列,例如 1. row_ind = N;更新一些列 2. row_ind = Y;更新一些列

我将如何在 sqlserver/oracle 中实现这一目标

WHEN MATCHED THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
           TARGET.LinkId = SOURCE.Id where row_ind ='Y'

UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
           TARGET.LinkId = SOURCE.Id where row_ind = 'N';

【问题讨论】:

您实际使用的是哪个数据库系统?对于 SqlServer,您可以查看表变量并通过连接进行更新 有什么理由不能把逻辑放在源子查询中?这将使更新部分更清晰。它肯定可以在 Oracle 中工作,并且可能也可以在 SQL Server 中工作。 【参考方案1】:

您可以使用“CASE..WHEN”在Oracle中实现如下:

WHEN MATCHED THEN UPDATE SET TARGET.NODEID = CASE ROW_IND
    WHEN 'Y'   THEN SOURCE.STARTNODEID
    WHEN 'N'   THEN SOURCE.ENDNODEID
END,
TARGET.LINKID = SOURCE.ID;

谢谢

【讨论】:

【参考方案2】:

对于tsql,您可以尝试使用AND <clause_search_condition>

MERGE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]  
    USING <table_source>   
    ON <merge_search_condition>  
    [ WHEN MATCHED [ AND <clause_search_condition> ]     <==
        THEN <merge_matched> ] [ ...n ]  
<merge_matched>::=  
      UPDATE SET <set_clause> | DELETE  

因为您可以在 AND 之后有多个 WHEN MATCHED 和不同的附加条件,您可以使用单个合并语句创建多个更新。

WHEN MATCHED AND row_ind ='Y' THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
           TARGET.LinkId = SOURCE.Id 
WHEN MATCHED AND row_ind ='N' THEN
UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
           TARGET.LinkId = SOURCE.Id ;

在oracle 你不能这样做,因为只允许一个merge_update_clause

mysql 不支持 MERGE

【讨论】:

以上是关于如何在单个合并语句中执行多个更新的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个提交合并到另一个分支上作为单个压缩提交?

如何在单个表中应用合并

是否可以使用单个 UPDATE SQL 语句执行多个更新?

如何将多个sql脚本执行到具有相同版本的flyway中

我们如何在反应原生项目中将多个图像合并为单个图像

如何在单个语句中更新整个列