Db2

合併到語句中的多個查詢

  • March 8, 2019

我有一個場景,如果 DB2 中不存在記錄,我想插入它。如果它已經存在,請將 is_active 列更新為現有行的 0 並插入新行,其中 is_active 為 1。

我不能使用合併,因為我不能在匹配部分中執行 2 個查詢。

我怎樣才能批量實現這一點。

如果我要一個一個地執行查詢,我可以執行它們。但由於有數百萬條這樣的記錄,我想批量執行此操作。

我想使用 java 準備好的語句來做到這一點。

使用臨時表

create table test_tab (id int not null, is_active int not null) in userspace1;

with stream (id) as (values 
--1, 2, 3
--2, 3, 4
3, 4, 5
)
, upd as (
select count(1) cnt
from new table(
 update test_tab t
 set is_active=0
 where is_active=1 and exists (select 1 from stream s where s.id=t.id)
)
)
select count(1) cnt
from new table(
 insert into test_tab(id, is_active)
 select id, 1
 from stream
);

select * from test_tab;

假設您streams在每次嘗試更改基表之前將批處理值累積到表中test_tab

您可以使用如上所述的單個語句來完成所有操作。

如果你想使用一些真實的表而不是streams,那麼在每個這樣的語句之前收集它的統計數據並使用streams表中不同數量的記錄來測試性能是值得的。

使用批量插入

create table test_tab2 (id int not null, is_active int not null default 1, id_int bigint not null generated always as identity) in userspace1;
create index test_tab2_idx on test_tab2(id);

create trigger test_tab2_air
after insert on test_tab2
referencing new as n
for each row
update test_tab2 t
set is_active=0
where t.is_active=1 and t.id=n.id and t.id_int<>n.id_int;

insert into test_tab2 (id) values 
--1, 2, 3
--2, 3, 4
3, 4, 5
;

您可以在 java 程序中批量插入新記錄。觸發deactivates相應的舊記錄。

我不認為你可以在一個語句中做到這一點,MERGE因為當匹配時你需要更新和插入。但是您當然可以在單個事務中使用 2 個語句UPDATE和(以及第 3 個來清除源)來完成它。INSERT

假設我們要table_name使用表中的數據進行更新,new_values並且標識“匹配”的列是列uq1uq2

BEGIN TRANSACTION ;
   UPDATE table_name AS t           -- the target
   SET is_active = 0
   WHERE EXISTS
         ( SELECT 1
           FROM new_values AS s     -- the source
           WHERE s.uq1 = t.uq1
             AND s.uq2 = t.uq2
             -- AND <cond>          -- batching condition
         )
     ;

   INSERT INTO table_name
     ( uq1, uq2, c3, c4, c5, is_active )
   SELECT 
       uq1, uq2, c3, c4, c5, 1
   FROM 
       new_values
   -- WHERE
   --     <cond>          -- batching condition
     ;

   DELETE FROM new_values
   -- WHERE
   --     <cond>          -- batching condition
     ; 
COMMIT ;

引用自:https://dba.stackexchange.com/questions/231573