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函數的認識。
原文地址:http://blog.sina.com.cn/s/blog_3ff4e1ad0100tdl2.html