oracle多表關聯更新

2021-08-20 02:01:59 字數 2615 閱讀 6763

oracle的更新語句不通mssql那麼簡單易寫,就算寫出來了,但執行時可能會報 這是由於set**的子查詢查出了多行資料值,oracle規定一對一更新資料,所以提示出錯。要解決這樣必須保證查出來的值一一對應。

原理 update語句的原理是先根據where條件查到資料後,如果set中有子查詢,則執行子查詢把值查出來賦給更新的字段,執行更新。

update dept a

set a.loc = (select b.loc from test_dept b where a.deptno = b.deptno)

where exists (select 1 from test_dept b where a.deptno = b.deptno);

查表a的所有資料,迴圈每條資料,驗證該條資料是否符合exists(select 1 from 表b where a.欄位2=b.欄位2)條件,如果是則執行(select b.欄位1 from 表b where a.欄位2=b.欄位2)查詢,查到對應的值更新a.欄位1中。關聯表更新時一定要有exists(select 1 from 表b where a.欄位2=b.欄位2)這樣的條件,否則將表a的其他資料的字段1更新為null值。

二、提高oracle更新效率的各種解決方案

1,標準update語法 當需要更新的表是單個或者被更新的字段不需要關聯其他錶帶過來,則最後選擇標準的update語句,速度最快,穩定性最好,並返回影響條數。 如果where條件中的字段加上索引,那麼更新效率就更高。但對需要關聯表更新欄位時,update的效率就非常差。

2,inline view更新法 inline view更新法就是更新乙個臨時建立的檢視。如:

**示例:

update (select a.join_state as join_state_a, b.join_state as join_state_b

from t_join_situation a, t_people_info b

where a.people_number = b.people_number

and a.year = '2011'

and a.city_number = 'm00000'

and a.town_number = 'm51000')

set join_state_a = join_state_b

括號裡通過關聯兩表建立乙個檢視,set中設定好更新的字段。這個解決方法比寫法較直觀且執行速度快。但表b的主鍵一定要在where條件中,並且是以「=」來關聯被更新表,否則報一下錯誤:   3,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)的比較,如果匹配,就進行更新的操作(update),如果不匹配,就進行插入操作(insert)。執行merge不會返回影響的行數。merge語句的寫法比較繁瑣,並且最多只能兩個表關聯,複雜的語句用merge更新法將力不從心且效率差。

4,快速游標更新法 語法如:  

begin for cr in (查詢語句) loop –-迴圈    --更新語句(根據查詢出來的結果集合) endloop; --結束迴圈 end;   oracle支援快速游標,不需要定義直接把游標寫到for迴圈中,這樣就方便了我們批量更新資料。再加上oracle的rowid物理字段(oracle預設給每個表都有rowid這個字段,並且是唯一索引),可以快速定位到要更新的記錄上。

例子:  

**示例:

begin

for cr in (select a.rowid,b.join_state 

from t_join_situation a,t_people_info b

where a.people_number=b.people_number and

a.year='2011'and 

a.city_number='m00000'and 

a.town_number='m51000'

)loop

update t_join_situation set join_state=cr.join_state where

rowid = cr.rowid;

end loop;

end;

使用快速游標的好處很多,可以支援複雜的查詢語句,更新準確,無論資料多大更新效率仍然高,但執行後不返回影響行數。

三、結論 方案 建議 標準update語法 單錶更新或較簡單的語句採用使用此方案更優。 inline view更新法 兩表關聯且被更新表通過關聯表主鍵關聯的,採用此方案更優。 merge更新法 兩表關聯且被更新表不是通過關聯表主鍵關聯的,採用此方案更優。 快速游標更新法 多表關聯且邏輯複雜的,採用此方案更優。

**:

oracle多表關聯更新

1.首先將其他表的資料抽取到一張臨時表裡面。create table temp dim2 as select t.stdaddr,s.dzbm from demp dim t,dzmlpxz pt s where t.sdaddr s.mc 2.進行分組查詢,看看裡面的記錄是否有重複的。select...

oracle 多表關聯更新語句

在使用資料庫進行更新操作時,我們可能會碰到一種情況,有表a和表b兩張表,需要更新表b中的某個欄位時,需要關聯a b兩表,將a表中的字段值賦值給b,此時執行sql語句如下 update 表a set a.欄位1 select b.欄位1 from 表b where a.欄位2 b.欄位2 where ...

oracle多表關聯更新推薦方法

待更新表 表名 newtab name value 電腦手機 導管資料 表 表名 oldtab goods price 電腦 1600 手機 12 導管 1 將oldtab表中的price值更新到newtab的value中去,關聯關係是oldtab.goods newtab.name begin f...