设为首页 收藏本站
查看: 1204|回复: 6

[经验分享] oracle数据库零碎---Oracle Merge 使用,表中存在数据就修改,没有数据自动添加

[复制链接]

尚未签到

发表于 2013-3-3 21:28:11 | 显示全部楼层 |阅读模式
Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行insertsupdates操作. MERGE命令从一个或多个数据源中选择行来updatinginserting到一个或多个表.Oracle10gMERGE有如下一些改进:
1UPDATEINSERT子句是可选的
2UPDATEINSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
语法:
MERGEHINTINTO SCHEMA .TABLE T_ALIAS
USINGSCHEMA . {TABLE | VIEW |SUBQUERY } T_ALIAS
ON (CONDITION)
WHENMATCHEDTHEN MERGE_UPDATE_CLAUSE
WHENNOTMATCHED THEN MERGE_INSERT_CLAUSE / MERGE_DELETE_CLAUSE;
联想:
merge into是特有的功能,相当于在 MSSQL中的
ifexists(...)
updatetable
else
Insertinto table.
mergeinto语法不仅没有if exists语法啰嗦,而且比if exists还要高效很多,常用来在oracle之间同步数据库表。
例子:
1、创建测试表及数据
[c-sharp] view plaincopyprint?
  • DROP TABLE PRODUCTS;
  • DROP TABLE NEWPRODUCTS;
  • create table PRODUCTS
  • (
  • PRODUCT_ID INTEGER,
  • PRODUCT_NAME VARCHAR2(60),
  • CATEGORY VARCHAR2(60)
  • );
  • insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');
  • insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');
  • insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');
  • insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');
  • insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');
  • commit;
  • create table NEWPRODUCTS
  • (
  • PRODUCT_ID INTEGER,
  • PRODUCT_NAME VARCHAR2(60),
  • CATEGORY VARCHAR2(60)
  • );
  • insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');
  • insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');
  • insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');
  • insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');
  • commit;

2、匹配更新
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID)
  • WHEN MATCHED THEN
  • UPDATE
  • SET P.PRODUCT_NAME = NP.PRODUCT_NAME,
  • P.CATEGORY = NP.CATEGORY;
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;

3、不匹配插入
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID)
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID
  • ,PRODUCT_NAME
  • ,CATEGORY)
  • VALUES
  • (NP.PRODUCT_ID
  • ,NP.PRODUCT_NAME
  • ,NP.CATEGORY);
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;

4、匹配带where/on更新
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID)
  • WHEN MATCHED THEN
  • UPDATE SET P.PRODUCT_NAME = NP.PRODUCT_NAME WHERE P.CATEGORY = NP.CATEGORY;
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID AND P.CATEGORY = NP.CATEGORY)
  • WHEN MATCHED THEN
  • UPDATE SET P.PRODUCT_NAME = NP.PRODUCT_NAME;
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;
  • SELECT *
  • FROM PRODUCTS A
  • INNER JOIN NEWPRODUCTS B
  • ON A.PRODUCT_ID = B.PRODUCT_ID
  • AND A.CATEGORY = B.CATEGORY;

5、匹配带where更新、插入
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID)
  • WHEN MATCHED THEN
  • UPDATE
  • SET P.PRODUCT_NAME = NP.PRODUCT_NAME,
  • P.CATEGORY = NP.CATEGORY
  • WHERE P.CATEGORY = 'DVD'
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID
  • ,PRODUCT_NAME
  • ,CATEGORY)
  • VALUES
  • (NP.PRODUCT_ID
  • ,NP.PRODUCT_NAME
  • ,NP.CATEGORY) WHERE NP.CATEGORY != 'BOOKS';
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;

6、ON常量表达式
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (1 = 0)
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID
  • ,PRODUCT_NAME
  • ,CATEGORY)
  • VALUES
  • (NP.PRODUCT_ID
  • ,NP.PRODUCT_NAME
  • ,NP.CATEGORY) WHERE NP.CATEGORY = 'BOOKS';
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;

7、匹配删除、不匹配插入
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID)
  • WHEN MATCHED THEN
  • UPDATE
  • SET P.PRODUCT_NAME = NP.PRODUCT_NAME,
  • P.CATEGORY = NP.CATEGORY DELETE
  • WHERE (P.CATEGORY = 'ELECTRNCS')
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID
  • ,PRODUCT_NAME
  • ,CATEGORY)
  • VALUES
  • (NP.PRODUCT_ID
  • ,NP.PRODUCT_NAME
  • ,NP.CATEGORY);
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;

8、源表为子查询(自联接)
[c-sharp] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING (SELECT COUNT(*) CO FROM PRODUCTS WHERE PRODUCTS.PRODUCT_ID = 1501) B
  • ON (B.CO <> 0)
  • WHEN MATCHED THEN
  • UPDATE SET P.PRODUCT_NAME = 'KEBO' WHERE P.PRODUCT_ID = 1501
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID
  • ,PRODUCT_NAME
  • ,CATEGORY)
  • VALUES
  • (1501
  • ,'KEBO'
  • ,'NBA');
  • MERGE INTO PRODUCTS P
  • USING (SELECT COUNT(*) CO FROM PRODUCTS WHERE PRODUCTS.PRODUCT_ID = 1508) B
  • ON (B.CO <> 0)
  • WHEN MATCHED THEN
  • UPDATE SET P.PRODUCT_NAME = 'KEBO' WHERE P.PRODUCT_ID = 1508
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID
  • ,PRODUCT_NAME
  • ,CATEGORY)
  • VALUES
  • (1508
  • ,'KEBO'
  • ,'NBA');
  • SELECT * FROM PRODUCTS;


优点:
避免了分开更新
提高性能并易于使用
在数据仓库应用中十分有用
使用merge比传统的先判断再选择插入或更新快很多
需要注意的地方:
1、从语法条件上看(ON (join condition)),merge into也是一个危险的语法。如果不慎重使用,会将源表全部覆盖到目标表,既危险又浪费效率,违背了增量同步的原则。所以在设计表结构时,一般每条记录都有更新时间的字段,用目标表最大更新时间判断源表数据是否有更新和新增的信息。
2、更新的字段,不允许有关联条件的字段(join condition)。比如条件是 A.ID=B.ID,那么使用“SET A.ID=B.ID”将报出一个莫名其妙的提示错误。
缺少一个带delete语句选项的示例,暂为补上:
[sql] view plaincopyprint?
  • MERGE INTO PRODUCTS P
  • USING NEWPRODUCTS NP
  • ON (P.PRODUCT_ID = NP.PRODUCT_ID)
  • WHEN MATCHED THEN
  • UPDATE
  • SET P.PRODUCT_NAME = NP.PRODUCT_NAME, P.CATEGORY = NP.CATEGORY
  • --WHERE (P.CATEGORY = 'ELECTRNCS')
  • DELETE
  • WHERE (P.CATEGORY = 'ELECTRNCS')
  • WHEN NOT MATCHED THEN
  • INSERT
  • (PRODUCT_ID, PRODUCT_NAME, CATEGORY)
  • VALUES
  • (NP.PRODUCT_ID, NP.PRODUCT_NAME, NP.CATEGORY);
  • SELECT * FROM PRODUCTS;
  • SELECT * FROM NEWPRODUCTS;

MERGE INTO PRODUCTS PUSING NEWPRODUCTS NPON (P.PRODUCT_ID = NP.PRODUCT_ID)WHEN MATCHED THEN  UPDATE     SET P.PRODUCT_NAME = NP.PRODUCT_NAME, P.CATEGORY = NP.CATEGORY   --WHERE (P.CATEGORY = 'ELECTRNCS')   DELETE    WHERE (P.CATEGORY = 'ELECTRNCS')WHEN NOT MATCHED THEN  INSERT    (PRODUCT_ID, PRODUCT_NAME, CATEGORY)  VALUES    (NP.PRODUCT_ID, NP.PRODUCT_NAME, NP.CATEGORY);SELECT * FROM PRODUCTS;SELECT * FROM NEWPRODUCTS;

说明:DELETE语句删除的是满足matched关联on条件,同时也要是update更新内容的子集,否则不会删除任何内容。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-3329-1-1.html 上篇帖子: Oracle兵器谱上古神器之-KFED 下篇帖子: 解读Oracle执行计划 oracle 数据库 Oracle

尚未签到

发表于 2013-3-18 19:18:45 | 显示全部楼层
相当不错,感谢无私分享精神!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-17 08:09:21 | 显示全部楼层
不错不错,楼主您辛苦了。。。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-21 10:55:26 | 显示全部楼层
男人在结婚前觉得适合自己的女人很少,结婚后觉得适合自己的女人很多。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-27 09:50:15 | 显示全部楼层
生活***好玩,因为生活老***玩我!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-6-4 14:05:01 | 显示全部楼层
真是 收益 匪浅

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-6-8 14:05:58 | 显示全部楼层
我在马路边丢了一分钱

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表