Merge Into 语句代替Insert/Update在Oracle中的应用实战
动机:
想在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的语法如下:
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);
上面的语法大家应该都容易懂吧,那我们按照以上的逻辑再写一次。
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呢:)
接下来要改成正确的语句就容易多了,如下:
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了一遍.....汗!!!
我曾经犯过的一个错误如下所示,大家看出来是什么问题了吗?
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中的应用实战相关推荐
- 【存储过程】Merge Into语句实现Insert/Update在Oracle中的应用
最近接到一个新的接口需求,开发一个保存数据的接口,需要完成如下功能:有一个表T,有两个字段a(主键),b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条 ...
- mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...
SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...
- oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?
oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...
- DML语句(delete,insert,update)
DML语句 一.概述:DML (Data Manipulation Language 数据操作语言) insert 将记录插入到数据库 update 修改数据库的记录 delete 删除数据库的记录c ...
- oracle instead of update触发器,Oracle中的instead of触发器
Instead of : 用Trigger的内容替换 事件本身的动作,该触发器用在视图上,举例: 一:创建一个update替代触发器 (1)创建一个视图 1 create or replace vie ...
- oracle insert into insert,总结下Oracle 中的Insert用法
1.标准Insert --单表单行插入 语法: INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) 例子: inse ...
- oracle分页查询sql语句的rn,Mysql和Oracle中的分页SQL语句
以前总结过一篇,Oracle分页查询语句的优化,当时对Oracle分页语句也着实花费了点时间记忆,不过今天在面试的时候,又考到了不同数据库的分页sql语句,对Oracle数据库的书写又存在了问题,以为 ...
- oracle的insert写法,oracle中的insert语句
关键字: ORACLE insert into table oracle中的insert语句 在oracle中使用DML语言的insert语句来向表格中插入数据,先介绍每次只能插入一条数据的语法 IN ...
- oracle没有提交更新,oracle 中更新update不成功的原因
oracle 中执行insert into 与delete 都正常,但是执行update 却没有反应. 原因: 是因为记录锁.这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在o ...
最新文章
- 使用余弦相似度算法计算文本相似度-数学
- UIAlertview改变按钮位置 大小
- javascript格式化时间(几秒钟前,几分钟前,几小时前,几天前...)
- 转-eclipse管理多个workspace
- Storyboard的简单使用
- C语言高级编程:sizeof计算数组大小需要注意的问题
- 使用python写一个倒计时_Python 实现一个计时器
- 使用switch实现多选
- django安装与简介
- 在 OpenShift 4 上部署 Ansible Tower 环境
- java植树问题代码,小学数学最难的13种典型题,让孩子吃透了,拿高分不难!
- 小白学习使用gitee问题产生汇总(持续更新)
- cmd sqlplus远程连接_Oracle连接远程数据库的四种方法
- Linux嵌入式时区修改
- JNI中,getBytes()最好指明UTF-8
- ERStudio8.0 破解版 下载 download
- 联想ThinkPad SL410(28428KC)与2842-EWC区别
- win10电脑chm文件打不开的解决方法
- 智能电动车汽车充电器桩语音芯片ic方案对比分析 选型
- H3C新华三笔记本FN键锁定