Oracle(00):Update語句


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM