Oracle沒有update from語法,可以通過四種寫法實現同樣的功能:
一、標准update語法(常用、速度可能最慢)
當更新的表示單個或者被更新的字段不需要關聯表帶過來,此法是最好的選擇。
update a set a.c2= (select b.c2from b where a.c1=b.c1) where exists (select 1 from b where a.c1=b.c1)
二、內聯視圖更新(關聯主鍵字段,速度較快)
inline view更新法就是更新一個臨時建立的視圖。
方案:更新一個臨時建立的視圖。要求B表的主鍵字段必須在where條件中,並且是以=號來關聯被更新表。
update (select a.c2 as ac2,b.c2 as bc2 from a, b where a.c1=b.c1 and a.c3=’2011’) as M set ac2=bc2
三、merge更新法 (關聯字段非主鍵時,速度較快)
merge是oracle特有的語句,語法如下:
MERGE INTO table_name alias1 --主表,即需要被修改的表 USING (table | view | sub_query) alias2 --從表,即來源表 ON (join condition) --連接條件 WHEN MATCHED THEN --在匹配的記錄中進行 UPDATE table_name SET col1 = col_val1, col2 = col2_val --更改主表信息 WHEN NOT MATCHED THEN --在不匹配的情況下,篩選從表記錄插入到主表【可選】 INSERT (column_list) VALUES (column_values);
原理分析:在alias2中Select出來的數據,每一條都跟alias1進行 ON (join condition)的比較,如果匹配,就對alias1表進行更新的操作(Update),如果不匹配,就對alias1表進行插入操作(Insert)。
執行merge不會返回影響的行數,最多只能兩個表關聯。
merge into a using b on (a.c1=b.c1 and a.c3=’2011’) when matched then update a.c2=b.c2
四、快速游標更新法(復雜邏輯時,效率很高)
語法:
begin for cr in (查詢語句) loop --循環 update table_name set ... --更新語句(根據查詢出來的結果集合) end loop; --結束循環 end;
begin for cur in (select a.rowid ,b.c2 from a, b where a.c1=b.c1 and a.c3=’2011’ ) loop UPDATE a set c2=cur.c2 where rowid=cur.rowid; end loop; end;