Не получается корректный вывод при объединении нескольких столбцов после выполнения операции DML - PullRequest
0 голосов
/ 16 апреля 2020

1 таблица со структурой таблицы -

 create table t_output
 ( id        integer,
   desc      varchar2(10),
   inv_bfr   integer,
   inv_afr   integer,
   new_bfr   integer,
   new_afr   integer,
   diff      integer generated always as (inv_afr - inv_bfr) );

При запуске выполняется одна операция вставки DML, после которой обновляется столбец inv_afr.

select distinct b.sid from tab_a a, tab_b b where a.sid = b.sid    

Приведенный выше запрос выбора использовался для считать до sid до и после выполнения операции DML. inv_bfr, inv_afr, new_afr, new_bfr все в счетах. Столбец new_bfr будет обновляться, если sid существует до выполнения операции DML, но не после операции DML. Если для столбца new_afr то же самое, он будет обновляться, если sid существует после выполнения операции DML, но не до выполнения операции DML.

при выполнении операции DML вставка записи в таблицу tab_ c

Поэтому я использую оператор MERGE для объединения этих 3 столбцов (inv_bfr, new_bfr, new_afr). Для столбца inv_afr MERGE оператор может получить, но не может получить правильный вывод при MERGE этих 2 столбцах (new_bfr, new_afr). Я использую в MERGE для обновления этих двух значений столбцов - (например, столбца new_bfr)

merge into t_output t
using (select a.sub_id, count(distinct b.sid) as new_bfr
       from tab_a a, tab_b b
       where a.sid = b.sid 
         and not exists  
        (select distinct c.sid from tab_c c)
       group by a.sub_id) bfr
     when matched then 
      update set t.new_bfr = bfr.new_bfr;

Для new_afr я использовал MERGE оператор as-

merge into t_output t 
using (select c.sub_id, count(distinct c.sid) as new_afr from tab_c c
       where not exists 
       (select distinct b.sid
       from tab_a a, tab_b b
       where a.sid = b.sid)
       group by c.sub_id) afr
      when matched then
       update set t.new_afr = afr.new_afr;

Но когда я выполняю оба оператора MERGE в одном и том же операторе блока PL / SQL, но не могу получить правильный вывод. Даже если я проверил одно за другим оператор MERGE и использовал предложение WHEN NOT MATCHED, то также не смог получить правильный вывод. Не могли бы вы помочь мне в этом.

...