Oracle幾種update語句分析

2021-09-01 02:32:39 字數 1501 閱讀 4078

1.單條語句更新

語法:update 表名稱 set 列名稱 = 新值 where 列名稱 = 某值

說明:如果更新的字段加了索引,更新時會重建索引,更新效率會慢。單錶更新或較簡單的語句採用使用此方案更優。

2.批量資料更新

語法:update 表a set a.欄位1 = (select b.欄位1 from 表b where a.欄位2=b.欄位2) where exists(select 1 from 表b where a.欄位2=b.欄位2)

說明:查表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值。

3.merge更新法

語法:merge是oracle特有的語句,語法如下:

merge into table_name t1

using (table|view|sub_query) t2

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);

說明:在t2中select出來的資料,每一條都跟t1進行 on (join condition)的比較,如果匹配,就進行更新的操作(update),如果不匹配,就進行插入操作(insert)。執行merge不會返回影響的行數。merge語句的寫法比較繁瑣,並且最多只能兩個表關聯,複雜的語句用merge更新將力不從心且效率差。兩表關聯且被更新表不是通過關聯表主鍵關聯的,採用此方案更優。

4.利用儲存過程中游標更新

語法:

begin

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

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

end loop; --結束迴圈

end;

說明:oracle支援快速游標,不需要定義直接把游標寫到for迴圈中,這樣就方便了我們批量更新資料。再加上oracle的rowid物理字段(oracle預設給每個表都有rowid這個字段,並且是唯一索引),可以快速定位到要更新的記錄上。使用快速游標的好處很多,可以支援複雜的查詢語句,更新準確,無論資料多大更新效率仍然高,但執行後不返回影響行數。

多表關聯且邏輯複雜的,採用此方案更優。

Hive支援Update和Delete語句

文件說了hive從0.14開始支援的update和delete語句,我使用的hive是1.2.1版本。首先在hive site.xml裡配置如下屬性 hive.optimize.sort.dynamic.partition false hive.support.concurrency true hi...

Oracle批量Update記錄

工作中經常用到oracle批量更新記錄,做為老手也怕出錯,總之要小心再小心,確保資料批量更新正確。下面舉乙個例子 1 建立兩張結構類似的表,建表語句如下 create table jayt1 id int,code varchar2 8 create table jayt2 id int,code ...

update多列的幾種選擇

當 update 多列 時有如下幾種選擇 1.教科書式寫法 update t table a set f1 select f1 from testz b where a.id b.id f2 select f2 from testz b where a.id b.id f3 select f3 fr...