1、根據條件更新表裡的某個字段值,如下:update test t set t.b_salary =case when t.b_id = 5 then 5000 when t.b_id = 6 the
1、根據條件更新表裡的某個字段值,如下:
update test t set t.b_salary =
case when t.b_id = 5 then 5000
when t.b_id = 6 then 6000
when t.b_id = 7 then 7000
end
where t.b_id in (5,6,7)
說明: where條件部分一定要把記錄限制為隻需要更新的部分,否則其他部分會被更新為空。
2、2表關聯update某個字段的
a)、一對一關聯
update test1 t set t.a_salary =
( select a.b_salary from test a where a.b_id = t.a_id
)
where exists (select 1 from test a where a.b_id = t.a_id )
;
commit;
b)、一對多關聯
(1)、目标表一個ID存在多條記錄,源頭是一個ID存一條記錄,此種場景和一對一沒有差別
update test1 t set t.a_salary =
( select a.b_salary from test a where a.b_id = t.a_id
)
where exists (select 1 from test a where a.b_id = t.a_id )
;
commit;
(2)、目标表一個ID一條記錄,源頭是一個ID存在多條記錄
報錯ora-01427 :單行子查詢傳回多條記錄
本質上是目标表在源表根據關聯ID去找的時候,一個ID找到了多條記錄,傳回給目标表的一條記錄裡目标值為多個。
若傳回多個記錄值都是一樣的,傳回任意一條都可以,則此時對傳回值加上max,寫法如下:
update test1 t set t.a_salary =
( select max(a.b_salary) from test a where a.b_id = t.a_id
)
where exists (select 1 from test a where a.b_id = t.a_id )
c)、多對多關聯
報錯ora-01427 :單行子查詢傳回多條記錄
本質上是目标表在源表根據關聯ID去找的時候,一個ID找到了多條記錄,傳回給目标表的一條記錄裡目标值為多個。
若傳回多個記錄值都是一樣的,傳回任意一條都可以,則此時對傳回值加上max,寫法如下:
update test1 t set t.a_salary =
( select max(a.b_salary) from test a where a.b_id = t.a_id
)
where exists (select 1 from test a where a.b_id = t.a_id )
;
commit;
說明: exists的作用,防止更新沒有關聯上的記錄。若不加exists ,則目标表中無關記錄會被置空。故這個exists一定要加上。
總結:
1、對于更新表内容,一定要把更新内容限制在隻要更新的部分,where部分一定要有。
2、2表關聯update的時候,目标表根據關聯ID從源表去找記錄的時候,,存在ID重複的記錄和目标表沒有關系,要注意源表存在ID重複的記錄。
對于大表關聯update,普通的寫法,根本跑不動,百度了一下,根據rowid來更新,果然可以跑動。方法如下:
--t1 為源表
--t2 為要更新的目标表
declare
cursor cur is
select
a.t1_name, b.rowid row_id
from t1 a, t2 b
where a.t1_id = b.t2_id
order by b.rowid;
v_counter number;
begin
v_counter := 0;
for row in cur loop
update t2 t
set t.t2_name = row.t1_name
where rowid = row.row_id;
v_counter := v_counter + 1;
if (v_counter >= 1000) then
commit;
v_counter := 0;
end if;
end loop;
commit;
end;
相關閱讀:
Oracle update執行計劃原了解析與優化
Oracle 中 update nowait 的使用方法
Oracle存儲過程使用執行個體之update的使用
Oracle update關聯表的思路總結
Oracle for update of 和 for update差別
本文原創釋出php中文網,轉載請注明出處,感謝您的尊重!