--更新職業 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子句來去除一些不需要的行
參考:為了對比效果
採用其他的方式更新
1update 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...