2012年10月25日

比對二個 Table 的資料, 並進行資料更新

系統做資料同步,新的資料就用 Insert ,原本的資料就用 Update 指令,
當然也可以全部資料 delete 掉再全部重新 Insert 進去,
從 Oracle 10g 的版本開始就提供了一個 Marge 的指令,可以解決很多資料比對上的問題。
Merge 指令的缺點就是,只能二個 Table 進行資料異動。
優點是使用 Update 更新時要注意找不到資料會更新為 Null 的情況,用 Merge 可以避免。

例如:TableA 要依據 TableB 的欄位更新過來,一般都會寫:
            update TableA set (ColumnA2,ColumnA3) =
             (select ColumnB2,ColumnB3 from TableB where ColumnB1 = ColumnA1)
            但是如果要再增加判斷 TableB 的 ColumnB2 不是空的才更新,這樣要改成:
            update TableA set (ColumnA2,ColumnA3) =
             (select nvl(ColumnB2,ColumnA1),ColumnB3 from TableB where ColumnB1 = ColumnA1)

有了 Merge 的指令就可以比較有直覺的 SQL 語法了。
merge into TableA a  a using TableB b  on (a.ColumnA1= b.ColumnB1)
when matched then
   update set a.ColumnA2= b.ColumnB2, a.ColumnA3 = b.ColumnB3 where b.ColumnB2 is not null
when not matched then
   insert (ColumnA1,ColumnA2,ColumnA3) values (ColumnB1,ColumnB2,ColumnB3)

Marge 指令要如何變化不彷就研究試試看吧~~

沒有留言:

張貼留言