MERGE INTO 详解

oracle MERGE INTO

基本用法

	MERGE INTO TABLE1 t1 --要操作的表
	USING TABLE2 t2       --条件的表
	ON (t1.A=t2.A)  --关联条件
	WHEN MATCHED THEN  --匹配
		UPDATE SET t1.A='abc'--跟新语句
	     where t1.B = 123
	WHEN NOT MATCHED THEN --不匹配
	    INSERT VALUES('ABC'123); --插入语句

注意点1: on里面的关联条件实际效果------每条t2表里面的数据去t1表里面匹配
如果关联条件里没有t1.属性=t2.属性 就会造成对t1表的全表扫描,查询就会特别耗时

注意点2:WHEN MATCHED THEN/WHEN NOT MATCHED THEN 可以只存在一个
注意点3:update语句后面可同时执行删除 UPDATE SET t1.A=“abc” where t1.B = 123 DELETE WHERE t1.C=‘XYZ’

以下是实际系统遇到的问题

需求:顾客商品浏览记录表,如果已经插入了,浏览次数+1,没有浏览过新增一条
####耗时

MERGE INTO 浏览记录表 t1  
USING (select count(*) as count from 浏览记录表 t where t.顾客编号 = '123' and t.商品编号 = 'abc' ) t2      
ON (count > 0)  
WHEN MATCHED THEN  
	UPDATE SET t1.次数 = t1.次数+1,
     where t1.顾客编号 = '123' and t1.商品编号 = 'abc'
WHEN NOT MATCHED THEN
    INSERT VALUES('123','abc',1);
--由于浏览记录表数据量特别大 并且关联条件 ON (count > 0)里面没有t1.属性=t2.属性,故每条t2的记录都是对t1表的全表扫描,特别耗时

改进
MERGE INTO 浏览记录表 t1  
USING (select '123' as 顾客编号,'abc' as t.商品编号 from dual) t2      
ON (t1.顾客编号 = t2.顾客编号 and t1.商品编号 = t2.商品编号)  
WHEN MATCHED THEN  
	UPDATE SET t1.次数 = t1.次数+1,
     where t1.顾客编号 = '123' and t1.商品编号 = 'abc'
WHEN NOT MATCHED THEN
    INSERT VALUES('123','abc',1); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值