Oracle使⽤MERGEINTO语句更新数据
/*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;
*/
例⼦:
merge into users
using doctor
on (users.user_id= doctor.doctorid)
when matched then
update set users.user_name= doctor.doctorname
when not matched then
insert
update语法大全
values
(doctor.doctorid,
doctor.doctorid,
'8736F1C243E3B14941A59FF736E1B5A8',
doctor.doctorname,
sysdate,
'T',
'',
doctor.deptid,
'b319dac7-2c5c-496a-bc36-7f3e1cc066b8');
复制代码
第⼆个转载:
起因:
前段时间,因为涉及到⼀张表的⼤数据操作,要同时进⾏增删改,我跟师傅想了很多优化办法,结果都不尽⼈意。刚开始⽤的就是原始算法,先更新现有记录,再插⼊满⾜要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不⾏了,前台的超时时间是60s,远远⽆法满⾜要求。之后⼜想办法将任务进⾏拆分,根据每条记录流⽔号尾字符不同进⾏拆分,⽤多个线程同时执⾏,⼀直拆分成10个任务(尾字符分别为0、1、2、3 ... 9),⽤⼗个线程同时去执⾏,但是时间还是很慢,最多处理13W条数据左右,50W条数据就让⼈⽆法忍受了。最后⽆奈只好把之前的优化全部铲掉,改为merge into操作,再做了⼀些优化,将50W条数据的单线程耗时缩短到三⼗多秒,特此,将merge into的⽤法总结如下:(blog.csdn/yuzhic/article/details/1896878)
有⼀个表T,有两个字段a、b,我们想在表T中做Insert/Update,如果条件满⾜,则更新T中b的值,否则在T中插⼊⼀条记录。在Microsoft的SQL语法中,很简单的⼀句判断就可以了,SQL Server中的语法如下:
if exists(select1from T where T.a='1001' )
update T set T.b=2Where 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,2AS 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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论