另一种方法(Merge 除外)是使用两个 sql 语句,一个用于插入,一个用于更新。“WHEN MATCHED”和“WHEN NOT MATCHED”可以使用连接或“in”子句来处理。
如果您决定采用以下方法,最好先运行更新(因为它只对匹配的记录运行),然后插入不匹配的记录。无论哪种方式,数据集都是相同的,它只是按照以下顺序更新较少数量的记录。
此外,与合并类似,即使源和目标中的名称匹配,此更新语句也会更新名称列。如果您不想要那个,也可以将该条件添加到 where 中。
create table src_table(
id number primary key,
name varchar2(20) not null
);
create table tgt_table(
id number primary key,
name varchar2(20) not null
);
insert into src_table values (1, 'abc');
insert into src_table values (2, 'def');
insert into src_table values (3, 'ghi');
insert into tgt_table values (1, 'abc');
insert into tgt_table values (2,'xyz');
SQL> select * from Src_Table;
ID NAME
---------- --------------------
1 abc
2 def
3 ghi
SQL> select * from Tgt_Table;
ID NAME
---------- --------------------
2 xyz
1 abc
Update tgt_Table tgt
set Tgt.Name =
(select Src.Name
from Src_Table Src
where Src.id = Tgt.id
);
2 rows updated. --Notice that ID 1 is updated even though value did not change
select * from Tgt_Table;
ID NAME
----- --------------------
2 def
1 abc
insert into tgt_Table
select src.*
from Src_Table src,
tgt_Table tgt
where src.id = tgt.id(+)
and tgt.id is null;
1 row created.
SQL> select * from tgt_Table;
ID NAME
---------- --------------------
2 def
1 abc
3 ghi
commit;
可能有更好的方法来做到这一点,但这似乎很简单且面向 SQL。如果数据集很大,那么 PL/SQL 解决方案的性能将不会那么好。