1、 簡單舉例:
??? create
table
t1_a
as
???
?
select
rownum
id
,table_name
name
??? ???
from
user_tables;
??? create
table
t1_b
as
???
?
select
rownum
id
,table_name
name
??? ???
from
user_tables
??? ??
where
table_name
like
'T%'
;
--
比
t1_a
記錄少
??? merge
into
t1_b
??? using
t1_a
??? on
(t1_b.name = t1_a.name)
??? when
matched
then
???
?
update
set
t1_b.id = t1_b.id +
100000
??? when
not
matched
then
???
?
insert
values
(t1_a.id, t1_a.name);
??? --t1_b 表中沒有的記錄插入,有的記錄把 id+100000
??? merge
into
t1_b
??? using
t1_a
??? on
(t1_b.name = t1_a.name)
??? --when matched then
??? --? update set t1_b.id = t1_b.id
??? when
not
matched
then
??? ? insert values (t1_a.id, t1_a.name);
??? 如果使用10g,則順利執行。
??? truncate
table
t1_a;
??? truncate
table
t1_b;
??? insert
into
t1_a
values
(
1
,
'a'
);
??? insert
into
t1_b
values
(
1
,
'c'
);
??? insert
into
t1_b
values
(
1
,
'b'
);
??? commit
;
??? select
*
from
t1_a;
??? select
*
from
t1_b;
??? merge
into
t1_a
??? using
t1_b
??? on
(t1_b.id = t1_a.id)
??? when
matched
then
???
?
update
set
t1_a.name = t1_b.name
??? when
not
matched
then
???
?
insert
values
(t1_b.id, t1_b.name);
??? --ORA-30926: unable to get a stable set of rows in the source tables
?
?
4、不能修改作為關聯的列
?
??? truncate
table
t1_a;
??? truncate
table
t1_b;
??? insert into t1_a values ( 1 , 'a' );
??? insert
into
t1_b
values
(
1
,
'b'
);
??? commit ;
??? merge
into
t1_a
??? using
t1_b
??? on
(t1_b.id = t1_a.id)
??? when
matched
then
???
?
update
set
t1_a.id = t1_b.id
??? when
not
matched
then
???
?
insert
values
(t1_b.id, t1_b.name);
??? --ORA-00904: "T1_A"."ID": invalid identifier
?
?
?