【问题标题】:Oracle SQL Update甲骨文 SQL 更新
【发布时间】:2017-01-24 22:26:54
【问题描述】:

我有两个表 XX_1 和 XX_MAP_1。结构如下。

XX_1

XX_EMPLOYEE_ID    XX_GTN_NBR   ERNCD
00001              21
00001              23
00120              34
00120              37
00120              23

XX_MAP_1

XX_GTN        ERNCD
 21            A1
 22            A2
 23            BB1
 34            AB1

......

我需要能够使用来自 XX_MAP_1 的匹配值更新 XX_1 表(字段 ERNCD),其中 XX_GTN_NBR 匹配

预期结果

XX_EMPLOYEE_ID    XX_GTN_NBR   ERNCD
00001              21           A1
00001              23           BB1
00120              34           AB1  
00120              37
00120              23           BB1 

【问题讨论】:

    标签: sql oracle join sql-update


    【解决方案1】:

    Oracle 不支持连接更新语法,但您可以将UPDATE 与子查询一起使用:

    UPDATE XX_1 t1
    SET ERNCD = (SELECT t2.ERNCD FROM XX_MAP_1 t2 WHERE t2.XX_GTN = t1.XX_GTN_NBR)
    

    【讨论】:

      【解决方案2】:

      在这种情况下,merge 是首选解决方案。已经提供了。

      以下是使用连接更新语法的解决方案(根据另一个发布的答案,“Oracle 不支持”)。在这里展示不是为了与merge 解决方案竞争,而只是为了表明Oracle 确实支持连接更新语法。

      这是update 声明:

      update ( select x.erncd as x_erncd, m.erncd as m_erncd 
               from   xx_1 x inner join xx_map_1 m on x.xx_gtn_nbr = m.xx_gtn
             )
      set x_erncd = m_erncd;
      

      这里有一个竞赛环节来展示它是如何工作的。

      create table xx_map_1 (xx_gtn number primary key, erncd varchar2(10));
      
      insert into xx_map_1
        select 21, 'A1'  from dual union all
        select 22, 'A2'  from dual union all
        select 23, 'BB1' from dual union all
        select 34, 'AB1' from dual
      ;
      select * from xx_map_1;
      
          XX_GTN ERNCD    
      ---------- ----------
              21 A1        
              22 A2        
              23 BB1       
              34 AB1 
      
      create table xx_1 (xx_employee_id varchar2(20), xx_gtn_nbr number, erncd varchar2(10));
      
      insert into xx_1
        select '00001', 21, null from dual union all
        select '00001', 23, null from dual union all
        select '00120', 34, null from dual union all
        select '00120', 37, null from dual union all
        select '00120', 23, null from dual
      ;
      select * from xx_1;
      
      XX_EMPLOYEE_ID       XX_GTN_NBR ERNCD    
      -------------------- ---------- ----------
      00001                        21           
      00001                        23           
      00120                        34           
      00120                        37           
      00120                        23
      

      insert 语句和结果:

      update ( select x.erncd as x_erncd, m.erncd as m_erncd 
               from   xx_1 x inner join xx_map_1 m on x.xx_gtn_nbr = m.xx_gtn
             )
      set x_erncd = m_erncd;
      
      select * from xx_1;
      
      XX_EMPLOYEE_ID       XX_GTN_NBR ERNCD    
      -------------------- ---------- ----------
      00001                        21 A1        
      00001                        23 BB1       
      00120                        34 AB1       
      00120                        37           
      00120                        23 BB1
      

      【讨论】:

      • 谢谢,merge 就是答案。
      【解决方案3】:

      尝试仅使用子句“WHEN MATCHED THEN”的合并语句。

      MERGE INTO XX_1 X
      USING XX_MAP_1 XM
      ON (X.XX_GTN_NBR = XM.XX_GTN)
      WHEN MATCHED THEN
      UPDATE SET X.ERNCD = XM.ERNCD;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        相关资源
        最近更新 更多