Mergeinto语句是Oracle9i新增的语法,用于合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或多表联合查询的连接条件查询另一张表,如果连接条件匹配则执行UPDATE,如果不匹配则执行INSERT。这种语法只需要一次全表扫描就可以完成所有的工作,执行效率比INSERT+UPDATE要高。通过这个MERGE,可以在一个SQL语句中同时对一张表进行INSERT和UPDATE操作。MERGE在Oracle10g中有一些新的特性,后面会介绍这些新特性。先看MERGE语言方法如下:MERGEINTOTEST_NEWDMUSING(SELECTDATE_CD,HR_CD,DATE_HR,DECODE(GROUPING(CITY_ID),1,9999,CITY_ID)ASCITY_ID,DECODE(GROUPING(SYSTEM_ID),1,-9999,SYSTEM_ID)ASSYSTEM_ID,SUM(GSM_REG_USERCNT)ASGSM_REG_USERCNT,SUM(TD_REG_USERCNT)ASTD_REG_USERCNT,SUM(TD_REG_USERRAT)ASTD_REG_USERRAT,SUM(GSM_POWERON_USERCNT)ASGSM_POWERON_USERCNT,SUM(TD_POWERON_USERCNT)ASTD_POWERON_USERCNT,SUM(TD_POWERON_USERRAT)ASTD_POWERON_USERRATFROMTEST_OLDGROUPBYDATE_HR,DATE_CD,HR_CD,ROLLUP(SYSTEM_ID),ROLLUP(CITY_ID))TMPON(DM.DATE_CD=TMP.DATE_CDANDDM.HR_CD=TMP.HR_CDANDDM.CITY_ID=TMP.CITY_IDANDDM.SYSTEM_ID=TMP.SYSTEM_ID)WHENMATCHEDTHENUPDATESETDM.GSM_REG_USERCNT=TMP.GSM_REG_USERCNT,DM.TD_REG_USERCNT=TMP.TD_REG_USERCNT,DM.TD_REG_REG_DM.TD_REG_USERCNT,DM.TD_REG_REGGSM_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_HRWHENNOTMATCHEDTHENINSERT(DM.DATE_CD,DM.HR_CD,DM.DATE_HR,DM.CITY_ID.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)值(TMP.DATE_CD,TMP.HR_CD,TMP.DATE_HR,TMP.STY_MPID,TMP.CITY.GSM_REG_USERCNT,TMP.TD_REG_USERCNT,TMP.TD_REG_USERRAT,TMP.GSM_POWERON_USERCNT,TMP.TD_POWERON_USERCNT,TMP.TD_POWERON_USERRAT);WHENMATCHEDTHENUPDATESET表示当on中的关键字匹配时,会进行修改操作,但需要注意的是,在进行修改操作时,不能修改on中关键字的值。WHENNOTMATCHEDTHENINSERT表示当on中的关键字不匹配时,也就是说当TEST_NEW表中没有这条记录时,会进行新的操作。这时候再做一个new操作,就可以设置on中的字段的值了。在ORACLE10i中,MERGE具有以下新特性。1.UPDATE或INSERT子句是可选的。如果在某个系统中有一个订单表,现在要求新订单的记录反映在历史订单表ORDER_HISTORY中,我们可以这样写脚本:MERGEINTOORDER_HISTORYHUSING(SELECTORDER_ID,--OrderIDCUSTOMER_ID,--客户IDEMPLOYEE_ID,--员工IDORDER_DATE,--订单日期;REQUIRED_DATE,--预计到货日期-发货人地址SHIP_CITY,--发货人所在城市;SHIP_REGION,--发货人所在地区;SHIP_POSTALCODE,--发货人邮政编码SHIP_COUNTRY--发货人所在国家FROMORDER_DTLWHERETO_CHAR(ODER_DATE,'YYYY-MM-DD')='20110530')OON(O.ORDER_ID=H.ORDER_ID)WHENNOTMATCHEDTHENSERT(H.ORDER_ID,H.CUSTOMER_ID,H.EMPLOYEE_ID,H.ORDER_DATE,H.REQUIRED_DATE,H.SHIPPED_DATE,H.SHIPPER,H.FREIGHT,H.SHIP_NAM,H.SHIP_ADDRESS,H.SHIP_CITY,H.SHIP_REGION,H.SHIP_POSTALCODE,H.SHIP_COUNTRY)VALUES(O.ORDER_ID,O.CUSTOMER_ID,O.EMPLOYEE_ID,O.ORDER_DATE,O.REQUIRED_DATE,O.SHIPPED_DATE,O.SHIPPER,O.FREIGHT,O.SHIP_NAM,O.SHIP_ADDRESS,O.SHIP_CITY,O.SHIP_REGION,O.SHIP_POSTALCODE,O.SHIP_COUNTRY
);从上面可以看出,MATCHED或NOTMATCHED是可选的。WHENNOTMATCHEDTHENUPDATESET ..... WHENMATCHEDTHENUPDATESET ... WHENMATCHEDTHENINSERT2,UPDATE和INSERT子句可以加WHERE子句现在由于需求变化,我们只需要同步订单数据员工1001到订单历史表MERGEINTOORDER_HISTORYHUSING(SELECTORDER_ID,--订单号CUSTOMER_ID,--客户号EMPLOYEE_ID,--员工号ORDER_DATE,--订单日期;REQUIRED_DATE,--预计到货日期SHIPPED_DATE,--交货日期SHIPPER,--shipperFREIGHT,--运费SHIP_NAM,--发货人名称;SHIP_ADDRESS,--发货人地址SHIP_CITY,--发货人所在城市;SHIP_REGION,--发货人所在地区;SHIP_POSTALCODE,--发货人邮编SHIP_COUNTRY--发货人国家FROMORDER_DTL)OON(O.ORDER_ID=H。托运人=O。H.FREIGHT=O.FREIGHT,H.SHIP_NAM=O.SHIP_NAM,H.SHIP_ADDRESS=O.SHIP_ADDRESS,H.SHIP_CITY=O.SHIP_CITY,H.SHIP_REGION=O.SHIP_REGION,H.SHIP_POSTALCODE=O.SHIP_POSTALCODE,H.SHIP_COUNTRY=O.SHIP_COUNTRYWHEREO.EMPLOYEE_ID='1001'WHENNOTMATCHEDTHENINSERT(H.ORDER_ID,H.CUSTOMER_ID,H.EMPLOYEE_ID,H.ORDER_DATE,H.REQUIRED_DATE,H.SHIPPED_DATE,H.SHIPPER,H.FREIGHT,H.SHIP_NAM,H.SHIP_ADDRESS,H.SHIP_CITY,H.SHIP_REGION,H.SHIP_POSTALCODE,H.SHIP_COUNTRY)VALUES(O.ORDER_ID,O.CUSTOMER_ID,O.EMPLOYEE_ID,O.ORDER_DATE,O.REQUIRED_DATE,O.SHIPPED_DATE,O.SHIPPER,O.FREIGHT,O.SHIP_NAM,O.SHIP_ADDRESS,O.SHIP_CITY,O.SHIP_REGION,O.SHIP_POSTALCODE,O.SHIP_COUNTRY)WHEREO.EMPLOYEE_ID='1001';
