Заявление о слиянии с условиями, IBM DB2 sql слияние - PullRequest
0 голосов
/ 24 марта 2020

Мне любопытно, будет ли это работать. В настоящее время я заблокирован за целевой таблицей и теряю время разработки, поэтому я не могу протестировать его еще неделю и хочу перейти к следующему шагу.

Цель состоит в том, чтобы сделать следующее: Используя 3 первичных ключа (cch_id, event_type, event_time), мне нужно сравнить две таблицы данных (source_tb и target_tb), а затем обновить вторую таблицу (Target_tb) на основе следующие 3 критерия: 1. Для сопоставления данных ничего не делать 2. Для записей, поступающих из target_tb, но не исходящих из source_tb, истекает срок действия записей aka set event_type = 'EXPIRED' 3. Для записей, поступающих из исходного потока, но не доступных в целевую таблицу, вставьте ее.

MERGE target_tb как b ИСПОЛЬЗУЯ source_tb как ON (a.cch_id = b.cch_id, a.event_type = b.event_type, a.event_time = b.event_time) WHEN MATCHED THEN null //do nothing КОГДА НЕ СООТВЕТСТВУЕТ b.cch_id THEN b.event_type = 'EXP' ЕСЛИ НЕ СООТВЕТСТВУЕТ a.cch_id THEN INSERT a. *

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Вы не можете достичь этого с помощью MERGE, потому что вам нужно обновить несовпадающие строки в target_tb.
Если вы все еще хотите сделать это с помощью одного оператора, вы можете использовать select from data-change операция, как показано ниже:

create table target_tb (key int not null, val int);
create table source_tb (key int not null, val int);
insert into target_tb values (1, 1), (2, 2);
insert into source_tb values (3, 3), (2, 2);

with 
  u as 
(
select key 
from old table
(
update target_tb t
set val = -1
where not exists (select 1 from source_tb s where s.key = t.key)
)
)
, i as
(
select key 
from new table
(
insert into target_tb
select key, val
from source_tb s
where not exists (select 1 from target_tb t where t.key = s.key)
)
)
select a
from (values 1) t(a);

select * from target_tb;

Результат:

|KEY        |VAL        |
|-----------|-----------|
|1          |-1         |
|2          |2          |
|3          |3          |

ссылка dbfiddle .

0 голосов
/ 24 марта 2020

Я бы предложил использовать DB Fiddle .. https://dbfiddle.uk/?rdbms=db2_11.1

Но нет, я не верю, что ваше утверждение сработает. В частности,

Для записей, поступающих из target_tb, но не исходящих из source_tb, истекает срок действия записей aka set event_type = 'EXPIRED'

Слияние Db2 не поддерживает предложение WHEN NOT MATCHED BY SOURCE, которое SQL Сервер поддерживает ...

...