Oracle:在更新旧行的同时创建新行

问题描述

嗨,我正在尝试在更新旧行值的同时在下面创建新行。

下面有一个名为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'

输出

enter image description here

输出

解决方法

您可以使用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