sql - Oracle:更新旧行时创建新行
问题描述
嗨,我正在尝试在下面创建一个新行,同时更新旧行值。
我有一个名为 TestCustomer 的下表,我想将现有行状态更新为“I”,如果插入时 customer_id 匹配,则使用新的 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,emai_id,email_stat)values('223458','123456','I');
Insert Into TestCustomer(customer_id,emai_id,email_stat)values('223459','123457','A');
输入:
customer_id=223459 emai_id='23678'
输出:
输出
解决方案
您可以使用merge
在子句中包含 2 行的语句来获取它using
:一个 for update
,第二个 for 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
推荐阅读
- python - 如何在python中使用if else与范围?
- java - 返回仅包含给定数组的前 2 个元素的新数组的最短代码是什么?
- windows - 输入-PSSession powershell 到 RDP 并运行 IPConfig。给出错误
- .htaccess - 使用 .htaccess 重定向到不同服务器上的外部网站只是为了在开头有“www”
- spring-data-rest - 未找到搜索 API EntityRepresentationModel
- node.js - 在nodejs中提取多种类型的压缩文件
- r - HTML Rvest 抓取不显示表格
- html - 如何在 Django 中将多个上下文呈现为相同的 HTML
- reactjs - React 和 mobx :在商店中使用域类
- javascript - fullpage 不是构造函数问题