动机:

想在Oracle中用一条SQL语句直接进行Insert/Update的操作。

说明:

在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)。

实战:

接下来我们有一个任务,有一个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录。在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下:

if exists(select 1 from T where T.a='1001' ) update T set T.b=2 Where T.a='1001' else insert into T(a,b) values('1001',2);

以上语句表明当T表中如果存在a='1001' 的记录的话,就把b的值设为2,否则就Insert一条a='1001',b=2的记录到T中。

但是接下来在Oracle中就遇到麻烦了,记得在Oracle 9i之后就有一条Merge into 的语句可以同时进行Insert 和Update的吗,Merge的语法如下:

MERGE INTO table_name alias1 
USING (table|view|sub_query) alias2
ON (join condition) 
WHEN MATCHED THEN 
    UPDATE table_name 
    SET col1 = col_val1, 
        col2     = col2_val 
WHEN NOT MATCHED THEN 
    INSERT (column_list) VALUES (column_values); 

上面的语法大家应该都容易懂吧,那我们按照以上的逻辑再写一次。

MERGE INTO T T1
USING (SELECT a,b FROM T WHERE t.a='1001') T2
ON ( T1.a=T2.a)
WHEN MATCHED THEN
  UPDATE SET T1.b = 2
WHEN NOT MATCHED THEN 
  INSERT (a,b) VALUES('1001',2);

以上的语句貌似很对是吧,实际上,该语句只能进行更新,而无法进行Insert,错误在哪里呢?

其实在Oracle中Merge语句原先是用来进行整表的更新用的,也就是ETL工具比较常用的语法,重点是在Using上。

用中文来解释Merge语法,就是:

在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

因此,严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”

以上这句话也就很好的解释了在上面写的语句为何只能进行Update,而不能进行Insert了,因为都Select不到数据,如何能进行Insert呢:)

接下来要改成正确的语句就容易多了,如下:

MERGE INTO T T1
USING (SELECT '1001' AS a,2 AS b FROM dual) T2
ON ( T1.a=T2.a)
WHEN MATCHED THEN
  UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN 
  INSERT (a,b) VALUES(T2.a,T2.b);

查询结果,OK!

注意:

如果不懂Merge语句的原理,Merge语句是一条比较危险的语句,特别是在您只想更新一条记录的时候,因为不经意间,你可能就把整表的数据都Update了一遍.....汗!!!

我曾经犯过的一个错误如下所示,大家看出来是什么问题了吗?

MERGE INTO T T1
USING (SELECT Count(*) cnt FROM T WHERE T.a='1001') T2
ON (T2.cnt>0)
WHEN MATCHED THEN
  UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN 
  INSERT (a,b) VALUES(T2.a,T2.b);

Merge Into 语句代替Insert/Update在Oracle中的应用实战相关推荐

  1. 【存储过程】Merge Into语句实现Insert/Update在Oracle中的应用

    最近接到一个新的接口需求,开发一个保存数据的接口,需要完成如下功能:有一个表T,有两个字段a(主键),b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条 ...

  2. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  3. oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?

    oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...

  4. DML语句(delete,insert,update)

    DML语句 一.概述:DML (Data Manipulation Language 数据操作语言) insert 将记录插入到数据库 update 修改数据库的记录 delete 删除数据库的记录c ...

  5. oracle instead of update触发器,Oracle中的instead of触发器

    Instead of : 用Trigger的内容替换 事件本身的动作,该触发器用在视图上,举例: 一:创建一个update替代触发器 (1)创建一个视图 1 create or replace vie ...

  6. oracle insert into insert,总结下Oracle 中的Insert用法

    1.标准Insert --单表单行插入 语法: INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) 例子: inse ...

  7. oracle分页查询sql语句的rn,Mysql和Oracle中的分页SQL语句

    以前总结过一篇,Oracle分页查询语句的优化,当时对Oracle分页语句也着实花费了点时间记忆,不过今天在面试的时候,又考到了不同数据库的分页sql语句,对Oracle数据库的书写又存在了问题,以为 ...

  8. oracle的insert写法,oracle中的insert语句

    关键字: ORACLE insert into table oracle中的insert语句 在oracle中使用DML语言的insert语句来向表格中插入数据,先介绍每次只能插入一条数据的语法 IN ...

  9. oracle没有提交更新,oracle 中更新update不成功的原因

    oracle 中执行insert into 与delete 都正常,但是执行update 却没有反应. 原因: 是因为记录锁.这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在o ...

最新文章

  1. 使用余弦相似度算法计算文本相似度-数学
  2. UIAlertview改变按钮位置 大小
  3. javascript格式化时间(几秒钟前,几分钟前,几小时前,几天前...)
  4. 转-eclipse管理多个workspace
  5. Storyboard的简单使用
  6. C语言高级编程:sizeof计算数组大小需要注意的问题
  7. 使用python写一个倒计时_Python 实现一个计时器
  8. 使用switch实现多选
  9. django安装与简介
  10. 在 OpenShift 4 上部署 Ansible Tower 环境
  11. java植树问题代码,小学数学最难的13种典型题,让孩子吃透了,拿高分不难!
  12. 小白学习使用gitee问题产生汇总(持续更新)
  13. cmd sqlplus远程连接_Oracle连接远程数据库的四种方法
  14. Linux嵌入式时区修改
  15. JNI中,getBytes()最好指明UTF-8
  16. ERStudio8.0 破解版 下载 download
  17. 联想ThinkPad SL410(28428KC)与2842-EWC区别
  18. win10电脑chm文件打不开的解决方法
  19. 智能电动车汽车充电器桩语音芯片ic方案对比分析 选型
  20. H3C新华三笔记本FN键锁定

热门文章

  1. IO流和集合的交集Properties类的介绍。
  2. 可有可无的Mysql工作技巧 2
  3. Java生产环境下性能监控与调优详解 第8章 JVM字节码与Java代码层调优
  4. Linux 问题故障定位,看这一篇就够了
  5. 内联函数和宏定义的区别
  6. Go Web编程--解析JSON请求和生成JSON响应
  7. 在scrapy上使用cookie模拟登录
  8. mysql中的派生表
  9. 微服务网关总结之 —— zuul
  10. springboot(八):RabbitMQ详解