Oracle Merge into [转] [ http://www.cnblogs.com/dongsheng/p/4384754.html]

Oracle中Merge into用法总结

起因:

  前段时间,因为涉及到一张表的大数据操作,要同时进行增删改,我跟师傅想了很多优化办法,结果都不尽人意。刚开始用的就是原始算法,先更新现有记录,再插入满足要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不行了,前台的超时时间是60s,远远无法满足要求。之后又想办法将任务进行拆分,根据每条记录流水号尾字符不同进行拆分,用多个线程同时执行,一直拆分成10个任务(尾字符分别为0、1、2、3 ... 9),用十个线程同时去执行,但是时间还是很慢,最多处理13W条数据左右,50W条数据就让人无法忍受了。最后无奈只好把之前的优化全部铲掉,改为merge into操作,再做了一些优化,将50W条数据的单线程耗时缩短到三十多秒,特此,将merge into的用法总结如下:(http://blog.csdn.net/yuzhic/article/details/1896878)

  有一个表T,有两个字段a、b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在T中插入一条记录。在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);

  Oracle中,要实现相同的功能,要用到Merge into来实现(Oracle 9i引入的功能),其语法如下:

复制代码
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 = col_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);

复制代码

  严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数”。所以,要实现上面的功能,可以这样写:

复制代码
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);

复制代码

自己写的代码: 搞了一个半小时,20分钟因为破工具的原因

MERGE INTO (SELECT DT_DECLARATION_DATE ,CLAIM_ID FROM UIEW.T_IMPORTWARRANTYENGINECLAIM WHERE DT_DECLARATION_DATE IS NULL ) T1
USING (SELECT LN_CLAIM_ID,DT_CREATE FROM UIEW.T_WARRANTYENGINECLAIM WHERE DT_CREATE Oracle Merge into [转] [ http://www.cnblogs.com/dongsheng/p/4384754.html]

时间: 2024-10-26 15:21:46

Oracle Merge into [转] [ http://www.cnblogs.com/dongsheng/p/4384754.html]的相关文章

Oracle merge into的优势

简介 Oracle merge into命令,顾名思义就是“有则更新,无则插入”,这个也是merge into 命令的核心思想,在实际开发过程中,我们会经常遇到这种通过两表互相关联匹配更新其中一个表的某些字段的业务,有时还要处理不匹配的情况下的业务.这个时候你会发现随着表的数据量增加,类似这种业务场景的执行效率会比较慢,那是因为你需要多次重复查询两表中的数据,而通过merge into命令,只需要一次关联即可完成“有则更新,无则插入”的业务场景,大大提高语句的执行效率. 语法 1 merge i

Oracle MERGE INTO的用法

很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 - 避免了分开更新 - 提高性能并易于使用

[Oracle] Merge语句

Merge的语法如下: MERGE [hint] 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; MERGE是什么,如何使用呢?让我们先看一个简单的需求: 需求是,从T1表更新数

oracle merge用法

动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert). 实战: 接下来我们有一个任务,有一个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录.在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL S

Oracle merge

oracle merge 語法: 用途: Use the MERGE statement to select rows from one or more sources for update orinsertion into a table or view. You can specify conditions to determine whether toupdate or insert into the target table or view. It lets you avoid mult

ORACLE MERGE INTO语句,unable to get a stable set of rows in the source tables报错解决

ORACLE数据库,MERGE INTO语句,经常会出现  ORA-30926: unable to get a stable set of rows in the source tables   这个错误,如下图所示: 经检查,这个错误是由于数据来源表(即语句中,from关键字后面的表)存在数据重复造成的.在实际项目研发中,我们一般不能随便改动数据表的记录,那么如何避免这种错误的产生以及如何改正错误呢? 请看下面的SQL: MERGE INTO TEMP_ZL_ACCOUNTLIST t1 U

Oracle MERGE INTO的使用方法

非常多时候我们会出现例如以下情境,假设一条数据在表中已经存在,对其做update,假设不存在,将新的数据插入.假设不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这种话须要写很多其它的代码,同一时候性能也不好,要来回数据库两次.使用merge的话则能够一条SQL语句完毕. 1)主要功能 提供有条件地更新和插入数据到数据库表中 假设该行存在,运行一个UPDATE操作,假设是一个新行,运行INSERT操作 - 避免了分开更新 - 提高性能

Oracle MERGE INTO语法探究

1.MERGE INTO 的用途:   MERGE INTO 是Oracle 9i新增的语法,在10g时得到补充,用来合并UPDATE和INSERT语句,根据一张表或子查询与另一张表进行连接查询,连接条件匹配就进行 UPDATE,不匹配就进行INSERT,这个语法仅需要一次全表扫描就可以完成全部工作,执行效率会比单纯的UPDATE+INSERT高,具体应用可用于表之间的同步.2.MERGE INTO 的语法:语法结构:MERGE [INTO [schema .] table [t_alias]

ORACLE MERGE INTO

使用一条SQL语句进行insert或者Update操作,如果数据库中存在数据就update,如果不存在就insert. Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert. 当using后面的SQL没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的. 1 测试数据准备 select * from student order by stu_id; select * from student_tem