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中,我们可以如下写脚本:
- MERGE INTO ORDER_HISTORY H USING
- (
- SELECT ORDER_ID ,--订单编号
- CUSTOMER_ID ,--客户编号
- EMPLOYEE_ID ,--员工编号
- ORDER_DATE ,--订购日期;
- REQUIRED_DATE ,--预计到达日期
- SHIPPED_DATE ,--发货日期
- SHIPPER ,--运货商
- FREIGHT ,--运费
- SHIP_NAM ,--货主姓名;
- SHIP_ADDRESS ,--货主地址
- SHIP_CITY ,--货主所在城市;
- SHIP_REGION ,--货主所在地区;
- SHIP_POSTALCODE ,--货主邮编
- SHIP_COUNTRY --货主所在国家
- FROM ORDER_DTL
- WHERE TO_CHAR(ODER_DATE, 'YYYY-MM-DD') = '20110530'
- ) O
- ON
- (
- O.ORDER_ID = H.ORDER_ID
- )
- WHEN NOT MATCHED THEN INSERT
- (
- 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 或NOT MATCHED是可选的。不必非得
- WHEN NOT MATCHED THEN UPDATE SET
- .....
- WHEN MATCHED THEN INSERT
2、UPDATE和INSERT子句可以加WHERE子句
现在由于需求改变,我们仅仅需要把员工1001的订单数据同步到订单历史记录表
- MERGE INTO ORDER_HISTORY H USING
- (
- SELECT ORDER_ID ,--订单编号
- CUSTOMER_ID ,--客户编号
- EMPLOYEE_ID ,--员工编号
- ORDER_DATE ,--订购日期;
- REQUIRED_DATE ,--预计到达日期
- SHIPPED_DATE ,--发货日期
- SHIPPER ,--运货商
- FREIGHT ,--运费
- SHIP_NAM ,--货主姓名;
- SHIP_ADDRESS ,--货主地址
- SHIP_CITY ,--货主所在城市;
- SHIP_REGION ,--货主所在地区;
- SHIP_POSTALCODE ,--货主邮编
- SHIP_COUNTRY --货主所在国家
- FROM ORDER_DTL
- ) O
- ON
- (
- O.ORDER_ID = H.ORDER_ID
- )
- WHEN MATCHED THEN UPDATE SET
- H.CUSTOMER_ID = O.CUSTOMER_ID ,
- H.EMPLOYEE_ID = O.EMPLOYEE_ID ,
- H.ORDER_DATE = O.ORDER_DATE ,
- H.REQUIRED_DATE = O.REQUIRED_DATE ,
- H.SHIPPED_DATE = O.SHIPPED_DATE ,
- H.SHIPPER = O.SHIPPER ,
- 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_COUNTRY
- WHERE O.EMPLOYEE_ID = '1001'
- WHEN NOT MATCHED THEN INSERT
- (
- 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
- ) WHERE O.EMPLOYEE_ID = '1001';
新闻标题:Oracle基础教程之Mergeinto
分享网址:http://www.shufengxianlan.com/qtweb/news31/206431.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联