使用merge into 來更新目標表的個別字段

2022-02-11 00:27:07 字數 3064 閱讀 7435

--

更新職業 5s

merge into

cr_gr x using

(select b.custid,c.new_grbh,b.occupation /*

職業*/,nvl(d.new_bm,'

90') new_occupation /*

新職業*/

from cm002@to_db2

bleft

join scdy_grzhbh_dzb c on b.custid=

c.old_grbh

left

join scdy_tmp_zgzy_dzb d on trim(b.occupation)=

d.old_bm

where occupation<>''

) new_tab

on (x.grbh=

new_tab.new_grbh )

when matched then

update

set x.zhiye=

new_tab.new_occupation;

採用

--

通過構造臨時表test_source,把前後的對照關係找清楚,並且可觀測到

merge into

test_target

using test_source

on (test_source.id = test_target.id)--

注意,如果是多條件,則 on後邊一定要有個括號,把各條件都括進來

when matched then

update

set test_target.name =

test_source.name

when

not matched then

insert

values(test_source.name,test_source.id);--

最後一行可以省略

1、update或insert子句是可選的 

2、update和insert子句可以加where子句 

3、在on條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表 

4、update子句後面可以跟delete子句來去除一些不需要的行 

參考:為了對比效果

採用其他的方式更新

1

update test_target a set a.name=(

with b as (select id,name from

test_source )

select a.name from a where a.id=

b.id

)

2、建立中間的臨時表

3、主表加索引

4、update語句

update cr_gr a set (a.zhiye,a.zhichen,a.jylx)=

(select nvl(d.new_bm,'

90'),nvl(b.techpost,'

0'), nvl(d.new_bm,'

90') from cm002@to_db2

b left

join scdy_grzhbh_dzb c on b.custid=

c.old_grbh

left

join scdy_tmp_zgzy_dzb d on b.occupation=

d.old_bm

where c.new_grbh=a.grbh);

測試語句

drop

table

t_stat;

create

table t_stat(a1 int,b1 int,c1 varchar2(20

));insert

into t_stat select

level,mod(level,1000), null

from dual connect by

level

<=

100000

;commit

;select

count(1) from t_stat t;--

10萬條資料

select

*from

t_stat;

---構造b表

drop

table

t_ref;

create

table t_ref(b1 int,c2 varchar2(20

));insert

into t_ref select mod(level,1000),null

from dual connect by

level

<=

1000

;update t_ref set c2='能更

'where b1<=

500;

update t_ref set c2=

''where b1>

500;

commit;--

----------------開始更新

--方法1:1.3s

merge into

t_stat s

using t_ref t

on (t.b1 =

s.b1)

when matched then

update

set s.c1 =

t.c2;

----驗證

select

*from

t_stat;

--清空

update t_stat set c1 =

null

;commit;--

----------方法2 update ----2.7s

update t_stat a set a.c1=

(

select b.c2 from t_ref b where a.b1=

b.b1

);select

*from t_ref

使用merge into總結

第二次使用merge into時依舊出現了問題,覺得這個語句即是常用語句並且效率也高,所以總結下 1.用於對比的字段不能放在update下面,比如id之類的 2.string truncted。報出這個異常是由於某些欄位在做更新的過程中,目標表的字段長度小於匯入值,需要修改目標表字段的長度。3.由於...

merge into的模板使用

1,建立兩測試表 create table merge test1 test1 id number,test1 name varchar2 100 create table merge test2 test2 id number,test2 name varchar2 100 2,測試表插入資料 i...

Oracle中merge into的使用

語法 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 va...