/*Merge into 详细介绍
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
*/
/*語法:
MERGE [INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
*/
/*
我们还是以《sql中的case应用》中的表为例。在创建另两个表fzq1和fzq2
*/
--全部男生记录
create table fzq1 as select * from fzq where sex=1;
--全部女生记录
create table fzq2 as select * from fzq where sex=0;
/*涉及到两个表关联的例子*/
--更新表fzq1使得id相同的记录中chengji字段+1,并且更新name字段。
--如果id不相同,则插入到表fzq1中.
--将fzq1表中男生记录的成绩+1,女生插入到表fzq1中
merge into fzq1 aa     --fzq1表是需要更新的表
using fzq bb            -- 关联表
on (aa.id=bb.id)        --关联条件
when matched then       --匹配关联条件,作更新处理
update set
aa.chengji=bb.chengji+1,
aa.name=bb.name         --此处只是说明可以同时更新多个字段。
when not matched then    --不匹配关联条件,作插入处理。如果只是作更新,下面的语句可以省略。
insert values( bb.id, bb.name, bb.sex,bb.kecheng,bb.chengji);
--可以自行查询fzq1表。
/*涉及到多个表关联的例子,我们以三个表为例,只是作更新处理,不做插入处理。当然也可以只做插入处理*/
--将fzq1表中女生记录的成绩+1,没有直接去sex字段。而是fzq和fzq2关联。
merge into fzq1 aa     --fzq1表是需要更新的表
using (select fzq.id,fzq.chengji from fzq join fzq2on fzq.id=fzq2.id) bb -- 数据集
on (aa.id=bb.id)        --关联条件
when matched then       --匹配关联条件,作更新处理
update set
aa.chengji=bb.chengji+1
--可以自行查询fzq1表。
/*不能做的事情*/
merge into fzq1 aa
using fzq bb
on (aa.id=bb.id)
when matched then
update set
aa.id=bb.id+1
/*系统提示:
ORA-38104: Columns referenced in the ON Clause cannot be updated: "AA"."ID"
我们不能更新on (aa.id=bb.id)关联条件中的字段*/
update fzq1
set id=(select id+1 from fzq where fzq.id=fzq1.id)
where id in
(select id from fzq)
--使用update就可以更新,如果有更好的方法,谢谢反馈!from this:http://hi.baidu.com/rhuang666/blog/item/09bae812ce7a752add540120.html
Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.Oracle 10g中MERGE有如下一些改进:1、UPDATE或INSERT子句是可选的2、UPDATE和INSERT子句可以加WHERE子句3、ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行首先创建示例表: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;1、可省略的UPDATE或INSERT子句在Oracle 9i, MERGE语句要求你必须同时指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一个. 下面的例子根据表NEWPRODUCTS的PRODUCT_ID字段是否匹配来updates表PRODUCTS的信息:SQL> MERGE INTO products p2 USING newproducts np3 ON (p.product_id = np.product_id)4 WHEN MATCHED THEN5 UPDATE6 SET p.product_name = np.product_name,7 p.category = np.category;3 rows merged.SQL> SELECT * FROM products;PRODUCT_ID PRODUCT_NAME CATEGORY---------- -------------------- ----------1501 VIVITAR 35MM ELECTRNCS1502 OLYMPUS CAMERA ELECTRNCS1600 PLAY GYM TOYS1601 LAMAZE TOYS1666 HARRY POTTER TOYSSQL>SQL> ROLLBACK;Rollback complete.SQL>在上面例子中, MERGE语句影响到是产品id为1502, 1601和1666的行. 它们的产品名字和种 类被更新为表newproducts中的值. 下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 对于在两个表中能够匹配上PRODUCT_ID的数据不作任何处理. 从这个例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中.SQL> MERGE INTO products p2 USING newproducts np3 ON (p.product_id = np.product_id)4 WHEN NOT MATCHED THEN5 INSERT6 VALUES (np.product_id, np.product_name,7 np.category);1 row merged.SQL> SELECT * FROM products;PRODUCT_ID PRODUCT_NAME CATEGORY---------- -------------------- ----------1501 VIVITAR 35MM ELECTRNCS1502 OLYMPUS IS50 ELECTRNCS1600 PLAY GYM TOYS1601 LAMAZE TOYS1666 HARRY POTTER DVD1700 WAIT INTERFACE BOOKS2、带条件的Updates和Inserts子句你能够添加WHERE子句到UPDATE或INSERT子句中去, 来跳过update或insert操作对某些行的处理. 下面例子根据表NEWPRODUCTS来更新表PRODUCTS数据, 但必须字段CATEGORY也得同时匹配上:SQL> MERGE INTO products p2 USING newproducts np3 ON (p.product_id = np.product_id)4 WHEN MATCHED THEN5 UPDATE6 SET p.product_name = np.product_name7 WHERE p.category = np.category;2 rows merged.SQL> SELECT * FROM products;PRODUCT_ID PRODUCT_NAME CATEGORY---------- -------------------- ----------1501 VIVITAR 35MM ELECTRNCS1502 OLYMPUS CAMERA ELECTRNCS1600 PLAY GYM TOYS1601 LAMAZE TOYS1666 HARRY POTTER DVDSQL>SQL> rollback;在这个例子中, 产品ID为1502,1601和1666匹配ON条件但是1666的category不匹配. 因此MERGE命令只更新两行数据. 下面例子展示了在Updates和Inserts子句都使用WHERE子句:SQL> MERGE INTO products p2 USING newproducts np3 ON (p.product_id = np.product_id)4 WHEN MATCHED THEN5 UPDATE6 SET p.product_name = np.product_name,7 p.category = np.category8 WHERE p.category = 'DVD'9 WHEN NOT MATCHED THEN10 INSERT11 VALUES (np.product_id, np.product_name, np.category)12 WHERE np.category != 'BOOKS'SQL> /1 row merged.SQL> SELECT * FROM products;PRODUCT_ID PRODUCT_NAME CATEGORY---------- -------------------- ----------1501 VIVITAR 35MM ELECTRNCS1502 OLYMPUS IS50 ELECTRNCS1600 PLAY GYM TOYS1601 LAMAZE TOYS1666 HARRY POTTER TOYSSQL>注意由于有WHERE子句INSERT没有插入所有不匹配ON条件的行到表PRODUCTS.3、无条件的Inserts你能够不用连接源表和目标表就把源表的数据插入到目标表中. 这对于你想插入所有行到目标表时是非常有用的. Oracle 10g现在支持在ON条件中使用常量过滤谓词. 举个常量过滤谓词例子ON (1=0). 下面例子从源表插入行到表PRODUCTS, 不检查这些行是否在表PRODUCTS中存在:SQL> MERGE INTO products p2 USING newproducts np3 ON (1=0)4 WHEN NOT MATCHED THEN5 INSERT6 VALUES (np.product_id, np.product_name, np.category)7 WHERE np.category = 'BOOKS'SQL> /1 row merged.SQL> SELECT * FROM products;PRODUCT_ID PRODUCT_NAME CATEGORY---------- -------------------- ----------1501 VIVITAR 35MM ELECTRNCS1502 OLYMPUS IS50 ELECTRNCS1600 PLAY GYM TOYS1601 LAMAZE TOYS1666 HARRY POTTER DVD1700 WAIT INTERFACE BOOKS6 rows selected.SQL>4、新增加的DELETE子句Oracle 10g中的MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.下面例子验证DELETE子句. 我们从表NEWPRODUCTS中合并行到表PRODUCTS中, 但删除category为ELECTRNCS的行.SQL> MERGE INTO products p2 USING newproducts np3 ON (p.product_id = np.product_id)4 WHEN MATCHED THEN5 UPDATE6 SET p.product_name = np.product_name,7 p.category = np.category8 DELETE WHERE (p.category = 'ELECTRNCS')9 WHEN NOT MATCHED THEN10 INSERT11 VALUES (np.product_id, np.product_name, np.category)SQL> /4 rows merged.SQL> SELECT * FROM products;PRODUCT_ID PRODUCT_NAME CATEGORY---------- -------------------- ----------1501 VIVITAR 35MM ELECTRNCS1600 PLAY GYM TOYS1601 LAMAZE TOYS1666 HARRY POTTER TOYS1700 WAIT INTERFACE BOOKSSQL>产品ID为1502的行从表PRODUCTS中被删除, 因为它同时匹配ON条件和DELETE WHERE条件. 产品ID为1501的行匹配DELETE WHERE条件但不匹配ON条件, 所以它没有被删除. 产品ID为1700 的行不匹配ON条件, 所以被插入表PRODUCTS. 产品ID为1601和1666的行匹配ON条件但不匹配DELETE WHERE条件, 所以被更新为表NEWPRODUCTS中的值.

转载于:https://www.cnblogs.com/itjeff/p/7090585.html

Merge into 详细介绍相关推荐

  1. C++11 unordered_map详细介绍

    整理的算法模板合集: ACM模板 目录: 1.介绍 1.1 特性 2. 模版 2.1 迭代器 3. 功能函数 3.1 构造函数 3.2 容量操作 3.2.1 size 3.2.2 empty 3.3 ...

  2. hibernate主键详细介绍

    hibernate主键详细介绍 /** * * @author liuguangyi * @content ejb3注解的API定义在javax.persistence.*包里面. * * 注释说明: ...

  3. Hadoop生态系统的详细介绍

    hadoop生态系统的详细介绍 简介 Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算.今 ...

  4. hadoop生态系统的详细介绍-详细一点

    前提 日常喜欢看一些微信分享的好文,总结下来,可以作为过滤器吧(节约更多人的时间!),在这里引用的是别人的文章!对原文的作者表示感谢!确实写的很好! hadoop生态系统的详细介绍 简介 Hadoop ...

  5. 卷积神经网络超详细介绍

    文章目录 1.卷积神经网络的概念 2. 发展过程 3.如何利用CNN实现图像识别的任务 4.CNN的特征 5.CNN的求解 6.卷积神经网络注意事项 7.CNN发展综合介绍 8.LeNet-5结构分析 ...

  6. unordered_map详细介绍

    转载自关联容器:unordered_map详细介绍(附可运行代码) 介绍 1 特性 2 Hashtable和bucket 模版 1 迭代器 功能函数 1 构造函数 12示例代码 2 容量操作 21 s ...

  7. 卷积神经网络超详细介绍(转载)

    卷积神经网络超详细介绍 文章目录 1.卷积神经网络的概念 2. 发展过程 3.如何利用CNN实现图像识别的任务 4.CNN的特征 5.CNN的求解 6.卷积神经网络注意事项 7.CNN发展综合介绍 8 ...

  8. 每一步详细介绍—在HM中进行CU PU TU划分以及PU最佳预测模式选择

    CU PU TU划分以及PU最佳预测模式选择 在HM对CU进行划分(CU模式判别).PU模式选择(划分).以及PU预测模式划分的过程总算有点理解,现对整个过程进行详细介绍. HM进行块划分和模式选择主 ...

  9. 详细介绍微软SQL Server 2008

    SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本.这篇文章详细介绍了Microsoft SQL Ser ...

最新文章

  1. 详细介绍Java垃圾回收机制
  2. SpringBoot第十二篇:springboot集成apidoc
  3. 向阿里学数字化转型,驱动业绩新增长
  4. Linux下快速静态编译Qt以及Qt动态/静态版本共存
  5. boost::hana::none_of用法的测试程序
  6. 第三次学JAVA再学不好就吃翔(part64)--自动装箱和自动拆箱
  7. 【Redis】有序集合的交集与并集
  8. ae可围绕帧拖动放大插件:Drag Zoom Pro for AE mac(兼容M1)
  9. c语言中加法和乘法的消耗,急!!!!c语言:求n次多项式的加法和乘法
  10. 浅析vue的双向数据绑定
  11. ButterKnife的安装与使用以及ButterKnife右键不显示的大坑
  12. node的module.exports和exports
  13. SAP HANA语法中单引号、双引号用法
  14. Codevs 5208 求乘方取模
  15. 警告:integer division in floating-point context
  16. 什么力量推动了互联网的进化
  17. 系统跟服务器的区别,域名服务器与根服务器区别
  18. windows开机的问题
  19. quarkus数据库篇之一:比官方demo更简单的基础操作
  20. 了解RS-232、RS-485串口通信协议

热门文章

  1. python迭代器两个基本方法可供参考_浅析python迭代器和生成器
  2. Chrome开发者工具详解(2)-Network面板
  3. js 包含某个字符串_[译] 5 大 JavaScript 字符串操作库
  4. MF0 AI+IoT K210 人脸识别模块 应用笔记-(1)
  5. 清华大学教评中心 <jpxzx2019@mail.tsinghua.edu.cn> 12月24日9:00-11:10试讲评审材料(庞观和朱峰老师)
  6. 灵动MM32 MCU助力全国大学生智能汽车竞赛
  7. js截屏 video_canvas与html5实现视频截图功能
  8. qtdesigner怎么实现菜单栏跳转_3种公众号菜单栏设置类型,手把手教你做,不会的话那就再看一遍...
  9. php表单传值哪几种方式,PHP表单传值的方式有哪些?
  10. linux和windows测评,Windows Server 2016 与 Linux同台PK