对Oracle minus、intersect、merge使用的理解

本文介绍了通过WebService获取更新数据并存入临时表的方法,利用intersect筛选出与本地数据完全相同的部分进行删除,最后通过merge语句高效地完成数据更新与插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在实现新数据更新旧数据的功能,为了实现这样的目的,走了些弯路,在这里记录下来,以便为今后留个印记。

首先就是利用webservice接口,从某个服务按照更新日期获得最新数据存入临时表;可是数据获得之后,发现有2/3的是和本地已有的数据没有什么差别,那么在让用户取舍数据时,就会带来不必要的工作量;于是决定把和完全相同的数据从临时表中完全删除,只保留与本地有差异的数据;刚开始时想到的就是取一条临时表的数据与本地数据逐个对比,但是有30个字段,写起来很麻烦,会遇到null如何比较的问题,而且效率很低。从网上查了些方法,试用了minus和intersect,在数据完全插入到临时表时,用

select c1,c2...c30 from tbtemp intersect

select c1,c2...c30 from tb

就取出了所有的与本地数据完全相同的数据,然后用delete把这些数据删除掉,就解决了数据重复的问题,而且效率也很高。


下面就要解决另外一个问题,就是从临时表到正式表数据更新的问题,如果已有某个主键,就更新该数据,否则就插入;刚开也是使用先判断是否有,然后再update\insert等,偶然在一本书上看到merge,细看了下,正式我需要的功能--有则更新无则添加,而且用30多万本地数据和1万多临时表数据测试了下,发现性能提高了很多,感觉很高兴;具体语法如下:

MERGE INTO table_name tb1 
USING (table|view|sub_query) tb2
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);

具体的网上的例子很多,但是还是自己动手实现了,才能更清楚的理解;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值