1.Insert data in db temp table from excel data
2.update data from temp table
上述的從Temp table取用資料Update資料表,就切入本篇的主題,可用的方法有三:
1.Update by sub-query
2.Update table view
3.Merge
方法一:
UPDATE bigTable b
SET (col1,col2,col3) = (
SELECT t.col1,t.col2,t.col3
FROM tempTable t
WHERE b.col = t.col)
where exists(
SELECT t.col1,t.col2,t.col3
FROM tempTable t
WHERE b.col = t.col);
方法二:
UPDATE (
SELECT b.col1 as old_col1,
b.col2 as old_col2,
b.col3 as old_col3,
t.col1 as new_col1,
t.col2 as new_col2,
t.col3 as new_col3
FROM bigTable b, tempTable t
WHERE b.col = t.col)
SET old_col1 = new_col1,
old_col2 = new_col2,
old_col3 = new_col3;
方法三:
MERGE INTO bigTable b
USING (SELECT col1 , col2 , col3 , col
tempTable t ) t
ON ( b.col = t.col)
WHEN matched THEN
UPDATE
SET old_col1 = new_col1,
old_col2 = new_col2,
old_col3 = new_col3;
測試結果:
方法一:140 sec
方法二:1 sec
方法三:未測透過方法二 明顯是效能最佳的解法,但若會被update的bigTable並非符合UK或PK的條件,將會產生"ORA-01779: cannot modify a column which maps to a non-key-preserved table"的錯誤,若你的table不適合建立UK或PK時,可透過hint的方式/*+ BYPASS_UJVC */來忽略UK的檢查。
UPDATE (
SELECT /*+ BYPASS_UJVC */ b.col1 as old_col1,
b.col2 as old_col2,
b.col3 as old_col3,
t.col1 as new_col1,
t.col2 as new_col2,
t.col3 as new_col3
FROM bigTable b, tempTable t
WHERE b.col = t.col)
SET old_col1 = new_col1,
old_col2 = new_col2,
old_col3 = new_col3;
參考網址:http://blog.csdn.net/yuhua3272004/archive/2008/08/06/2776121.aspx













