在合適的情況下選擇多行Update方式

2021-07-03 10:56:57 字數 2633 閱讀 4268

筆記主題:update更新多行資料(oracle)

更新日期:2013-07-25

說明:筆記總結了在工作中遇到過的幾種update方法和各種方法適用的範圍。

1.單錶更新

方案:使用標準update語法即可,執行穩定且效率較高

update table

set (column1,column2,...)=

value1,value2,...

;2.多表關聯更新

舉例:更新gkfq_rec表中所有slid與oa2_ftask表fi_inst相同的行,blzt字段值=oa2_ftask表的ft_lstate。

create table gkfq_rec (

slid char(12) parimary key,

blzt varchar2(50),

wjbt varchar2(100) not null,

create table oa2_ftask (

fi_inst char(12) parimary key,

fi_state int not null,

ft_lstate int not null,

方法描述

適用範圍

執行效率

傳統方案

一般情況適用

單錶更新效率高且穩定,多表時效率較慢

inline view更新法

關聯字段為主鍵

速度較快

merge更新法

關聯欄位非主鍵,適用於兩表關聯

非主鍵關聯表更新,速度較快

快速游標更新法

邏輯較複雜的情況

複雜邏輯時效率很高

(1)傳統方案(速度可能最慢)

update gkfq_rec a

set blzt=

(select b.ft_lstate from oa2_ftask b where a.slid=b.fi_inst)

where exists

(select 1 from oa2_ftask b where a.slid=b.fi_inst)

;//子查詢返回多行值時,通過where exists條件逐行過濾,一一匹配實現set唯一值

(2)inline view更新法(關聯主鍵字段,速度較快)

方案:更新乙個臨時建立的檢視。要求b表的主鍵字段必須在where條件中,並且是以=號來關聯被更新表,否則可能報錯:ora-01779:無法修改與非鍵值儲存表對應的列。當b表主鍵欄位為多列組合時,也有可能出現這一報錯。update (select a.blzt as blzt,b.ft_lstate as ft_lstate

from gkfq_rec a,oa2_ftask b where a.slid=b.fi_inst)

set blzt=ft_lstate

;(3)merge更新法(關聯欄位非主鍵時,速度較快)

語法:merge into table_name alias 1

using (table|view|sub_query) alias 2

on (join condition)

when matched then

update

set col1=col_val1,

col2=col_val2

when not matched then

insert (column_list) values (column_values);

方案:在alias2中select出來的資料,每一條都跟alias1進行on (join condition)比較,若匹配,就進行更新操作,不匹配,執行插入操作。merge不會返回影響行數,且最多只能兩表關聯,適用於連線條件不是主鍵的字段。

merge into gkfq_rec a

using oa2_ftask b

on (a.slid=b.fi_inst)

when matched then

update set a.blzt=b.ft_lstate;

(4)快速游標更新法(複雜邏輯時,效率很高)

語法:begin

for cr in (查詢語句) loop  --迴圈

update table_name set ...   --更新語句(根據查詢出來的結果集合)

end loop;  --結束迴圈

end;

方案:配合oracle獨有的內建rowid物理字段,使用快速游標,不需要定義,直接把游標寫到for迴圈中,快速定位並執行更新。它可以支援複雜邏輯的查詢語句,更新準確,無論資料多大更新效率依然很高。但執行後不返回影響行數。

begin

for aa in (select a.rowid as rowid,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask b

where a.slid=b.fi_inst ) loop

update gkfq_rec set blzt=aa.ft_lstate

where rowid=aa.rowid;

end loop;

end;

from:

在合適的情況下選擇多行Update方式

筆記主題 update更新多行資料 oracle 更新日期 2013 07 25 說明 筆記總結了在工作中遇到過的幾種update方法和各種方法適用的範圍。1.單錶更新 方案 使用標準update語法即可,執行穩定且效率較高 update table set column1,column2,valu...

在知道ip位址的情況下,求合適的子網掩碼

ip位址 ip address 的概念及其子網掩碼 subnet mask 的計算對於首次學習網路知識的初學者來說是一件比較困難的事情。下文所述是我看到別人的稍作修改的結果,希望可以幫到大家。按照目前使用的ipv4的規定,對ip位址強行定義了一些保留位址,即 網路位址 和 廣播位址 所謂 網路位址 ...

layoutSubviews在什麼情況下呼叫

1.在以下情況都會呼叫 注意 當view的size的值為0的時候,addsubview也不會呼叫layoutsubviews。當要給這個view新增子控制項的時候不管他的size有沒有值都會呼叫 2.先來看一下uiview的layoutsubviews在什麼情況下會呼叫 subview view s...