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 ...
随机推荐
- 【转】sun.misc.BASE64Encoder找不到jar包的解决方法
只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了.(太神奇了,转自http://blog. ...
- 实现ModelDriver接口的功能
ModelDriver接口 来自com.opensymphony.xwork2.ModelDriven.是xwork-2.1.2-750.jar包的东西. 下面是源码: package com.ope ...
- css3实现三角形,聊天背景气泡,心形等形状
1.聊天背景气泡: css代码如下: #talkbubble {width: 120px;margin:auto; background: red; position: relative; -moz- ...
- C#文本文件或其他文件新内容追加
以txt文本为例,以下代码实现a.txt文件中追加内容 FileStream mystream = new FileStream("C:\\a.txt", FileMode.Ope ...
- Oracle EBS-SQL (GL-4):从接收追溯到接收事务
SELECT row_id, creation_date, created_by, last_update_date, last_updated_by,last_update_login, note_ ...
- C#的线程池的那些事
最近在做站时发现,线程池的问题很棘手,所以总结了一篇关于线程池的文章,原文地址:http://www.shuonar.com/blog/ac16496b-87ec-4790-a9ea-d69bbffa ...
- [Leetcode][Python][DP]Regular Expression Matching
# -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/regular-expression-matching/ Implement reg ...
- Fibonacci(数论 输出前四位Fibonacci)
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ubuntu系统安装FTP
Ubuntu安装vsftp软件 1.更新软件源 首先须要更新系统的软件源,便捷工具下载地址:http://help.aliyun.com/manual?spm=0.0.0.0.zJ3dBU&h ...
- oracle传输表空间功能测试(含详细过程)
最近做数据迁移,之前有一篇迁移思路思考的文章,这里继续做具体的测试,主题问表空间传输. 一.源服务器上导出表空间 源服务器: 10.1.122.55 目标服务器:10.1.122.54 0.设置字 ...