簡體   English   中英

在 ORACLE 中使用 MERGE 語句刪除和插入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM