在这种情况下,merge 是首选解决方案。已经提供了。
以下是使用连接更新语法的解决方案(根据另一个发布的答案,“Oracle 不支持”)。在这里展示不是为了与merge 解决方案竞争,而只是为了表明Oracle 确实支持连接更新语法。
这是update 声明:
update ( select x.erncd as x_erncd, m.erncd as m_erncd
from xx_1 x inner join xx_map_1 m on x.xx_gtn_nbr = m.xx_gtn
)
set x_erncd = m_erncd;
这里有一个竞赛环节来展示它是如何工作的。
create table xx_map_1 (xx_gtn number primary key, erncd varchar2(10));
insert into xx_map_1
select 21, 'A1' from dual union all
select 22, 'A2' from dual union all
select 23, 'BB1' from dual union all
select 34, 'AB1' from dual
;
select * from xx_map_1;
XX_GTN ERNCD
---------- ----------
21 A1
22 A2
23 BB1
34 AB1
create table xx_1 (xx_employee_id varchar2(20), xx_gtn_nbr number, erncd varchar2(10));
insert into xx_1
select '00001', 21, null from dual union all
select '00001', 23, null from dual union all
select '00120', 34, null from dual union all
select '00120', 37, null from dual union all
select '00120', 23, null from dual
;
select * from xx_1;
XX_EMPLOYEE_ID XX_GTN_NBR ERNCD
-------------------- ---------- ----------
00001 21
00001 23
00120 34
00120 37
00120 23
insert 语句和结果:
update ( select x.erncd as x_erncd, m.erncd as m_erncd
from xx_1 x inner join xx_map_1 m on x.xx_gtn_nbr = m.xx_gtn
)
set x_erncd = m_erncd;
select * from xx_1;
XX_EMPLOYEE_ID XX_GTN_NBR ERNCD
-------------------- ---------- ----------
00001 21 A1
00001 23 BB1
00120 34 AB1
00120 37
00120 23 BB1