天天看點

Oracle實戰小技巧及報錯解決方案15:oracle資料比對merge into

前言:

 很久之前,估計在2010年左右在使用Oralce,當時有個需求就是需要對兩個表的資料進行比對,這兩個表的資料結構一緻,一個是正式表,一個是臨時表,這兩表資料量還算是比較大幾百M。業務需求是用臨時表中的資料和正式表的比對,所有字段都需要一一比對,而且兩表還沒有主鍵,這是一個比較麻煩和糟糕的事情。

場景:

1、如果兩表所有字段值都一緻則不處理;

2、如果有部分字段不一緻則更新;

3、如果正式表中資料在臨時表中不存在,則需要删除;

滿足上面場景的三個功能即可,可以用程式如(java,C,C#)等各種實作,也可以使用存儲過程oracle實作;

考慮之後用程式來做,這肯定是可以實作,但是撇開繁瑣的資料讀取、操作sql之外,還需要比對,而且效率也是個問題;就決定用存儲過程來實作,先前是使用了if exists來比對。後面發現效率不高,比較慢;後續改進之後引入了Oracle merge into來實作;

具體事例代碼(字段删除了大部分)如下:

1、對臨時表L_TABLE中資料與正式表Z_TABLE比較,如果各個字段值比較不相等則認為臨時表的這行資料是新增的,然後插入到正式表中。

merge into Z_TABLE t1  
  using (  
     select   
         S_SYSTEM_ID,  
         S_PORT_ID,  
         S_SY