问题描述
嗨,我正在尝试在更新旧行值的同时在下面创建新行。
下面有一个名为TestCustomer的表,如果要在插入时匹配customer_id,我想将现有行状态更新为“ I”,并使用新的email_Id和状态“ A”创建一个新行;
create table TestCustomer(customer_id varchar(18),emai_id varchar(18),email_stat char(1))
Insert Into TestCustomer(customer_id,emai_id,email_stat)values('223459','12345','A');
Insert Into TestCustomer(customer_id,email_stat)values('223458','123456','I');
Insert Into TestCustomer(customer_id,'123457','A');
输入:
customer_id=223459 emai_id='23678'
输出:
解决方法
您可以使用merge
语句在using
子句中包含2行来获取它:update
的其中一行,insert
的第二行:
merge into TestCustomer t
using (
select
c,223459 as customer_id,'23678' as emai_id
from dual,(select 'A' c from dual union all select 'X' c from dual)
) v
on (v.c='X' and t.customer_id=v.customer_id)
when matched then update
set email_stat='I'
when not matched then
insert (customer_id,emai_id,email_stat)
values(v.customer_id,v.emai_id,v.c)
where v.c='A';
如您所见,带有'X'的行用于更新,带有'A'的行。
完整示例:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=4f014283e5eff2e4cc81d09f0bbfca9b