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

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

首先就是利用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);

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

你可能感兴趣的:(对Oracle minus、intersect、merge使用的理解)