Db2
合併到語句中的多個查詢
我有一個場景,如果 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
並且標識“匹配”的列是列uq1
和uq2
: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 ;