Oracle基础教程之Merge into

  Merge into语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。

   通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。

  这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。通过这个MERGE你能够在一个SQL语句中对一个表同时执行INSERT和UPDATE操作. 在 Oracle 10g中MERGE有一些新特性,后面我会介绍这些新特征。先看看MERGE语法如下:

MERGE INTO TEST_NEW DM USING                   
(                                                             
        SELECT DATE_CD,                                       
              HR_CD,                                         
              DATE_HR,
              DECODE(GROUPING(CITY_ID), 1, 9999, CITY_ID) AS CITY_ID,
              DECODE(GROUPING(SYSTEM_ID), 1, -9999, SYSTEM_ID) AS SYSTEM_ID,
              SUM(GSM_REG_USERCNT) AS GSM_REG_USERCNT,
              SUM(TD_REG_USERCNT) AS TD_REG_USERCNT,
              SUM(TD_REG_USERRAT) AS TD_REG_USERRAT,
              SUM(GSM_POWERON_USERCNT) AS GSM_POWERON_USERCNT,
              SUM(TD_POWERON_USERCNT) AS TD_POWERON_USERCNT,
              SUM(TD_POWERON_USERRAT) AS TD_POWERON_USERRAT
        FROM  TEST_OLD
        GROUP BY DATE_HR, DATE_CD, HR_CD, ROLLUP(SYSTEM_ID),ROLLUP(CITY_ID)
) TMP
ON
(
                DM.DATE_CD  = TMP.DATE_CD
            AND DM.HR_CD    = TMP.HR_CD
            AND DM.CITY_ID  = TMP.CITY_ID
            AND DM.SYSTEM_ID = TMP.SYSTEM_ID
)
WHEN MATCHED THEN  UPDATE  SET
      DM.GSM_REG_USERCNT = TMP.GSM_REG_USERCNT,
      DM.TD_REG_USERCNT = TMP.TD_REG_USERCNT,
      DM.TD_REG_USERRAT = TMP.TD_REG_USERRAT,
      DM.GSM_POWERON_USERCNT  = TMP.GSM_POWERON_USERCNT,
      DM.TD_POWERON_USERCNT = TMP.TD_POWERON_USERCNT,
      DM.TD_POWERON_USERRAT = TMP.TD_POWERON_USERRAT,
      DM.DATE_HR = TMP.DATE_HR
WHEN NOT MATCHED THEN 
INSERT
(
      DM.DATE_CD,
      DM.HR_CD,
      DM.DATE_HR,
      DM.CITY_ID,
      DM.SYSTEM_ID,
      DM.GSM_REG_USERCNT,
      DM.TD_REG_USERCNT,
      DM.TD_REG_USERRAT,
      DM.GSM_POWERON_USERCNT,
      DM.TD_POWERON_USERCNT,
      DM.TD_POWERON_USERRAT
)
VALUES
(
      TMP.DATE_CD,
      TMP.HR_CD,
      TMP.DATE_HR,
      TMP.CITY_ID,
      TMP.SYSTEM_ID,
      TMP.GSM_REG_USERCNT,
      TMP.TD_REG_USERCNT,
      TMP.TD_REG_USERRAT,
      TMP.GSM_POWERON_USERCNT,
      TMP.TD_POWERON_USERCNT,
      TMP.TD_POWERON_USERRAT);

  WHEN MATCHED THEN UPDATE SET  表示当on里面的关键字匹配上的时候,就进行修改操作。

  但是值得注意的是,在做修改操作的时候,不可以修改on里面关键字的值。


  WHEN NOT MATCHED THEN INSERT 表示当on里面的关键字匹配不上的时候,也就是说没有这样一条记录存在TEST_NEW表中时,就进行新增操作。

  这时,做新增操作,就可以将on里面的字段进行设置值。

  在ORACLE 10i中,MERGE有如下一些新特性。

1、UPDATE或INSERT子句是可选的   
 
  假如某个系统中,有个订单表,现在要求新增订单的记录都要反应到订单历史表ORDER_HISTORY中,我们可以如下写脚本:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ce3ebb8529e59fdeef7a9d33bb8d5e8a.html