[英]Multiple clauses in MERGE for Oracle SQL: UPSERT AND DELETE in a single statement
[英]DELETE and INSERT using MERGE statement in ORACLE
我有实体员工,它有一个字段List<String> accountIds.
所以表结构如下所示:
CREATE TABLE EMPLOYEE (
ID varchar2(255) not null,
OBJ_ID varchar2(36),
NAME varchar2(255),
VER_NBR number(19,0),
CREATEID varchar2(255) not null,
CREATETIME timestamp (6) not null,
UPDATEID varchar2(255),
UPDATETIME timestamp (6),
primary key (ID));
并存储 AccountIds 我有另一个表
CREATE TABLE EMPLOYEE_ACCOUNT_IDS(
EMP_ID varchar2(255),
ACC_ID varchar2(255),
primary key (EMP_ID, ACC_ID)
);
更新操作:EMPLOYEE 表中的 ACCOUNT_IDS
现在,在应用程序中,我正在删除与员工相关的所有帐号并重新插入所有帐号。
提高性能并减少数据库查询次数。 这可能与“合并”声明有关吗?
是的。 有可能,不确定是否更快然后删除和插入。 我不知道你的输入是什么样的,所以你如何执行插入会很好。 无论如何,您可以连接现有数据和新值,并将此查询用作源表。
merge into employee_account_ids tgt
using (
with new_data(acc_id) as (select * from table(sys.odcivarchar2list('NEW01', 'NEW02', 'ACC13')))
select '001' emp_id, nvl(a.acc_id, n.acc_id) acc_id, rwd,
case when n.acc_id is null then 'del' end dsc
from new_data n
full join (select e.*, rowid rwd from employee_account_ids e where emp_id = '001') a
on a.acc_id = n.acc_id ) src
on (src.emp_id = tgt.emp_id and src.rwd = tgt.rowid)
when matched then update set tgt.acc_id = tgt.acc_id delete where dsc = 'del'
when not matched then insert values (src.emp_id, src.acc_id)
问题是您的第二个表没有我可以触摸以执行删除的虚拟列,因为 Oracle 需要先更新才能删除行。 所以我使用了 rowid,欺骗更新( tgt.acc_id = tgt.acc_id
)并且它有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.