熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

通過SELECT語句實現兩個記錄集的比較

2013-11-13 15:52:25  來源: Oracle 

   前言
  在程序設計過程中往往遇到比較兩個記錄集的差異判斷原來傳入的訂單資料與後來傳入的訂單資料之間的差異並且將差異的數據顯示給用戶
  實現的方式有多種如編程存儲過程返回游標在存儲過程中對兩批數據進行比較等等當然返回差異數據的方式多種多樣既可以是游標又可以臨時表或其它方式
  本文主要論述利用ORACLE的MINUS函數和OVER函數直接通過視圖實現兩個記錄集的比較
  
   實現步驟
   利用MINUS函數判斷原始表與比較表的增量差異<設兩個記錄集分別以表的方式存在為表A和表B其中A表為原始表B表為後來產生的比較表即要與A表進行比較的數據表>
  增量差異指A中存在的記錄哪些在B表中沒有的也就是說A表的記錄被修改或刪除
  
   利用MINUS函數判斷比較表與原始表的增量差異
  即B表中存在的記錄哪些在A表中沒有也就是說B表新增的或A表修改的記錄
  
   連接AB的增量差異表和BA的增量差異表利用OVER函數判斷數據重復的次數
  如果數據重復次數為則該記錄的標識為修改
  如果數據重復次數為且出現在AB的增量差異表中則該記錄的標識為刪除
  如果數據重復次數為且出現在BA的增量差異表中則該記錄的標識為新增
  
   實例演練
   創建數據表和實例環境<設原始記錄集為數據表A比較記錄集為數據表B當然實際應用過程中參與比較的通常是視圖不會是數據表>
  測試環境配置
  Drop Table a;
  Drop Table b;
  Create Table a(a Numeric()a Varchar());
  Create Table b(b nUMERIC()b VarChar());
  Insert Into a Values (a);
  Insert Into a Values (ba);
  Insert Into a Values (ca);
  Insert Into a Values (da);
  Insert Into b Values (a);
  Insert Into b Values (bba);
  Insert Into b Values (ca);
  Insert Into b Values (dda);
  Insert Into b Values (Eda);
  Commit;
  Select * from a;
  Select * From b;
  
   創建比較視圖
  Create Or replace View VW_Test_Minus as 
    標識重復出現的次數(次數=>刪除或新增次數=>修改)
    SELECT A
       a
       t A表/B表標識
       ROW_NUMBER() OVER (PARTITION BY A ORDER BY A) RN 記錄重復次數
     FROM 
      (
        Select aaA表 T  查看A表存在B表沒有的記錄(修改或刪除)
          from 
           (
             (Select * from a )
             Minus 
             (Select * From b)
           ) ab
        Union 聯合A表與B表不相同的記錄集
        Select bbB表 T  查看B表存在A表沒有的記錄(修改或新增)
          from 
           (
             (Select * from b )
             Minus 
             (Select * From a)
             ) ba
       ) F;
  /
   比較結果集
  Select a
    a
    T
    Rn
    Decode(Rn 標識記錄變化
     修改
     Decode(T
       A表刪除
       新增)) Mark
    From VW_Test_Minus
     Where Rn=(Select Count(*) From VW_Test_Minus V Where Va=VW_Test_Minusa)
  ;
   後記
  許多DBA都特別痛恨那些希望通過一句SELECT語句來實現復雜用戶需求的編碼人員使用MINUS和OVER函數來實現數據比較在執行效率上可能會存在問題
  本文的目的並不在於討論程序運行的效率而在於拋磚引玉引起大家對OVER函數的重視和對MINUS函數的認知
From:http://tw.wingwit.com/Article/program/Oracle/201311/17436.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.