Merge into 语句用法学习

   最近学习了下merge into的用法,merge into可以合并update/insert语句操作,对语句性能也有很大的提升。

Merge into 详细介绍
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 

别的不多少,直接上用法

MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias2] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;

此语句会对merge中的表t_alias进行更新或者insert操作,using中的结果集t_alias2为关联结果集,on中的表达式即为关联条件(注意:用于关联条件的列,在t_alias2中必须唯一,即t_alias2中查出来的行,关联条件列不能重复)


这个语句操作的行数(更新、插入)主要取决于t_alias2中查询出来的行数,以及t_alias关于关联列的重复数据量,比如t_alias有两列a,b,t_alias2有两列a,b,关联条件为t_alias.a=t_alias2=a,此时如果t_alias.a无重复列,则merge操作的数据为t_alias2中查询出来的行数;如果t_alias.a有重复列,则merge操作的数据为t_alias2查询的行数+count(t_alias.a)-distinct(t_alias.a) 『需要注意的是我这里提到的t_alias.a的数据应该为关联上的列数


示例:

#首先创建表t_merge
create table T_MERGE (a number, b number);
insert into t_merge values(1,2);
insert into t_merge values(2,3);
insert into t_merge values(3,4);
insert into t_merge values(4,4);
insert into t_merge values(5,4);
insert into t_merge values(6,4);
insert into t_merge values(7,4);
insert into t_merge values(7,8);
insert into t_merge values(7,8);


此时使用如下语句来对表t_merge进行操作

merge into t_merge t1
using (select a,b from t_merge2 t where t.b=4)t2
on (t1.a=t2.a)
when matched then
  update set t1.b=200
when not matched then
  insert (a,b) values(t2.a,200);


此时很明显,t2中数据量为6条(需要注意t2.a不能重复),根据关联条件进行关联,可以关联上的会进行更新操作,不能关联上的会进行insert操作,本条语句总共更新了6条,插入了2条数据。

根据之前我们提到的,此语句会进行6+6-4条操作(update+insert),其中第一个6为t2的总条数,第二个6位t1与t2关联上的总条数,4为关联上的distinct值。

如果不存在重复值,则只会操作6条数据。



需要注意的是merge into是条比较危险的语句,在操作生产时,一定要慎之又慎。




  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值