【问题标题】: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 中工作。

标签: mysql sql-server oracle


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多