oracle 两表数据对比---minus
1 引言
在程序设计的过程中,往往会遇到两个记录集的比较。如华东电网PMS接口中实现传递一天中变更(新增、修改、删除)的数据。实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等等。
本文主要讨论利用ORACLE的MINUS函数,直接实现两个记录集的比较。
2 实现步骤
假设两个记录集分别以表的方式存在,原始表为A,产生的比较表为B。
2.1 判断原始表和比较表的增量差异
利用MINUS函数,判断原始表与比较表的增量差异。
此增量数据包含两部分:
1)原始表A有、比较表B没有;
2)原始表A和比较表B都有,但是某些字段发生了改变。
2.2 判断比较表与原始表的增量差异
利用MINUS函数,判断比较表与原始表的增量差异。
此增量数据包含两部分:
1)比较表B有、原始表A没有;
2)比较表B和原始表A都有,但是某些字段发生了改变。
2.3 得出结果集
利用SQL语句中的对两种增量差异的处理,实现判别出比较表相对于原始表是进行了“插入”、“修改”、“删除”的情况。
3 实例演练
3.1创建表并插入数据
Create table A(A1 number(12),A2 varchar2(50));
Create table B(B1 number(12),B2 varchar2(50));
Insert Into A Values (1,'a');
Insert Into A Values (2,'ba');
Insert Into A Values (3,'ca');
Insert Into A Values (4,'da');
Insert Into B Values (1,'a');
Insert Into B Values (2,'bba');
Insert Into B Values (3,'ca');
Insert Into B Values (5,'dda');
Insert Into B Values (6,'Eda');
COMMIT;
3.2进行增量差异数据比较
3.2.1原始表A与比较表B的增量差异
Select * from A minus select * from B;
结果如下:
A1
A2
---------------------------------------------------------------
2
ba
4
da
3.2.2比较表B与原始表A的增量差异
Select * from B minus select * from A;
结果如下:
B1
B2
---------------------------------------------------------------
2
bba
5
dda
6
Eda
3.2.3两种增量差异的合集
此合集包含3类数据:
--1、原始表A存在、比较表B不存在,属于删除类数据,出现次数1
--2、原始表A不存在、比较表B存在,属于新增类数据,出现次数1
--3、原始表A和比较表B都存在,属于修改类数据,出现次数2
Select A1,A2,1 t from (Select * from A minus select * from B)
union
Select B1,B2,2 t from (Select * from B minus select * from A);
结果如下:
A1
A2
T
------------- --------------------------------------------------
----------
2
ba
1
2
bba
2
4
da
1
5
dda
2
6
Eda
2
3.3得到结果
Select A1,sum(t) from
(Select A1,A2,1 t from (Select * from A minus select * from B)
union
Select B1,B2,2 t from (Select * from B minus select * from
A))
Group by A1;
结果如下:
A1
SUM(T)
-----------------------
6
2
2
3
4
1
5
2
结果中SUM(T)为1的为“删除”的数据,SUM(T)为2的为“新增”的数据,SUM(T)为3的为“修改”的数据。
4 分析
4.1 效率分析
序号
数据库配置
Oracle版本
原表数据量
比较表数据量
字段列数
耗时
1
Cpu:2.5GHz/内存:2048M
9i
928335
3608159
19
171.594s
2
Cpu:2.5GHz/内存:2048M
9i
928335
3608159
10
121.469s
3
Cpu:2.5GHz/内存:2048M
9i
928335
3608159
5
68.938s
4
Cpu:2.5GHz/内存:2048M
9i
49933
928335
19
33s
5
Cpu:2.5GHz/内存:2048M
9i
49933
928335
10
25.968s
6
Cpu:2.5GHz/内存:2048M
9i
49933
928335
5
11.484s
7
16cpu:3.5GHz/内存:64G
10g
575283
575283
11
13.812s
8
16cpu:3.5GHz/内存:64G
10g
109987
109987
40
2.17s
4.2实现分析
在两个结果集比较的过程中,减少原始表和比较表比较的字段数目以及原始表和比较表的数据量都可以提高效率。
5 总结
此比较方法在执行效率上,可能不是非常好,但是能解决效率要求并不太高的问题。在实现上利用了Oracle的minus函数,此文在于引起大家对于Oracle函数的认识。
oracle 两表数据对比---minus的更多相关文章
- Oracle误删除表数据后的恢复具体解释
Oracle误删除表数据后的恢复具体解释 測试环境: SYSTEM:IBM AIX 5L Oracle Version:10gR2 1. undo_re ...
- oracle 两表关联查询
oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...
- Pl/sql 如何将oracle的表数据导出成excel文件?
oracle将表数据导出成excel文件的方法 1)在SQL窗体上,查询需要导出的数据 --查询数据条件-- ; 结果视图 2)在查询结果的空白处,右键选择Copy to Excel 3) 查看导出e ...
- oracle删除表数据的两种的方式
转自:https://blog.csdn.net/qq_37840993/article/details/82490787 平时写sql中我们都会用到删除语句,而平时删除表数据的时候我们经常会用到两种 ...
- excel表数据对比 个人收集
做了那么久猿,转行做测试以后居然折堕到要用excel来对比数据...~—~.真是人算不如天算...不过没关系,技多不压身. 首先,准备好两个对比的数据表,sheet1 跟sheet2 .在sheet1 ...
- 快速检查SQL两表数据是否一致
1前话 项目内实现了一新功能:克隆数据库. 2目标 克隆并非用SQLSERVER克隆,故完毕后需要检查各表内一些数据与原表一致性.一些表中的某一些列容许不一致. 3实现 将两表的需要检查的几列取出,相 ...
- oracle复制表数据,复制表结构
1.不同用户之间的表数据复制 2.同用户表之间的数据复制 3.B.x中个别字段转移到B.y的相同字段 4.只复制表结构 加入了一个永远不可能成立的条件1=2,则此时表示的是只复制表结构,但是不复制表内 ...
- oracle 复制表数据,复制表结构
1.不同用户之间的表数据复制 对于在一个数据库上的两个用户A和B,假如需要把A下表old的数据复制到B下的new,请使用权限足够的用户登入sqlplus:insert into B.new(selec ...
- oracle 清空表数据的2种方式及速度比较
1.情景展示 现在,需要清空该表数据 2.实现方式 为了比较删除速度,对该表进行复制 确认复制的表和原来的表数据是否一致 方式一:使用truncate table实现 方式二:使用de ...
随机推荐
- FAQ:win7和win8 64位注册ocx控件方法
win7/win8 问题所在: 64位的系统一般都是可以安装32位程序的, 执行 C:\Windows\SysWOW64\regsvr32.exe 而不是 C:\Windows\Sys ...
- hdu4745
区间DP,这类题目还是非常常见的,可惜平时都不怎么在意.一到比赛就弱得像鸟一样,真心囧. 题目要求很简单,就是一个最长的回文子序列,输出该子序列的长度. 区间DP,最常用的一种策略(类似于数学归纳法) ...
- Intellij IDEA+Maven+SpringMVC+HiBernate
转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生). 访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo
- 64位windows8的 IIS运行32位COM组件报错的解决
浏览时报错如下: Microsoft VBScript 运行时错误 错误 '800a01ad'ActiveX 部件不能创建对象: 'sqlcomp.FileSystemObject'/config.a ...
- 《转》读discuzx3.1 数据库层笔记
最近开始在看discuzx3.1的代码,看到数据库层的实现,discuzx的数据库层能够支撑数据库分库,分布式部署,主要水平分表,也可以很方便的支持其他数据库.性能上,可以做读写分离,支持数据缓存.可 ...
- hdu 2828 Lamp 重复覆盖
题目链接 给n个灯和m个开关, 每个灯可以由若干个开关控制, 每个开关也可以控制若干个灯, 问你能否找到一种开关的状态, 使得所有的灯都亮. 将灯作为列, 然后把每个开关拆成两行, 开是一行, 关是一 ...
- SQL Server 完成性检查的顺序
第一步: 默认值 第二步: 违反not null 限制 第三步: 判断check约束 第四步: 对引用表应用foreign key 检查 第五步: 对被引用表做 foreign key 检查 第六步: ...
- Yahoo团队经验:网站性能优化的34条黄金法则
Yahoo团队总结的关于网站性能优化的经验,非常有参考价值.英文原文:http://developer.yahoo.com/performance/rules.html 1.尽量减少HTTP请求次数 ...
- delphi 修改代码补全的快捷键(由Ctrl+Space 改为 Ctrl + alt + Space)
delphi 的IDE快捷键与输入法切换键中突,以往的解决方法是下载一个ImeTool修改 windows 系统的快捷键 在 xp win7 都好使,但在win 10经常是修改完后,重启又失效了. 本 ...
- 一些User-Agent
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", "Mozilla/4.0 (compatible; MSIE ...