我有实体Employee,它有一个字段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

现在,在应用程序中,我将删除与员工相关的所有帐户ID,然后重新插入所有帐户。

为了提高性能并减少数据库查询的数量。这与“合并”声明有关吗?

最佳答案

是的有可能,不确定是否更快然后删除并插入。我不知道您的输入是什么样子,所以您如何执行插入操作会很好。无论如何,您都可以合并现有数据和新值,并将此查询用作源表。

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)


dbfiddle

问题是您的第二张表没有空列,我可以触摸该列来执行删除,因为Oracle需要先更新才能删除行。因此,我使用了rowid,作弊的更新(tgt.acc_id = tgt.acc_id),它可以正常工作。

07-27 21:27