обновить и вставить в таблицу одним запросом - PullRequest
0 голосов
/ 06 июля 2019

стол 1

id            pk1         timestamp
1              a          10-jul-2019
2              h          11-mar-2019
3              k           19-jul-2019
4              j           7-n0v-2018
5              h          11-jul-2019

Таблица 2

col  start_date        end_date
a    10-jul-2019          
h    11-mar-2019       11-jul-2019
k    19-jul-2019          
j    7-nov-2018 
h    11-jul-2019

Q:> Я хочу, чтобы этот процесс повторялся через равные промежутки времени. если получено новое значение, введите в таблицу 1 то же самое значение должно войти в таблицу 2, но если существующие значения входят в таблицу 1, то просто обновите дату окончания предыдущего того же значения таблицы 2 и добавьте одно новое значение с нулевой датой окончания в таблицу 2 (пример значения H в таблице 1 и таблице 2).

нам нужно использовать только один запрос.

со слиянием мы не можем получить это

1 Ответ

2 голосов
/ 06 июля 2019

если получено новое значение, введите в таблицу 1 то же значение в таблицу 2, но если существующие значения входят в таблицу 1, то просто обновить дату окончания предыдущего значения таблицы 2 и добавить одну новую значение с нулевой датой окончания в таблицу 2

Ваш сценарий должен быть создан Trigger на Table1. Вы можете записать свою логику для обновления Table2 в Trigger. Смотри ниже демо:

--Table1 DDL
Create table tab1 (
  id           number,
  pk1          varchar(1),
  time_stamp   date
);

--Table2 DDL
create table tab2 (
  col          varchar(1),
  start_date   date,
  end_date     date
);

Вот триггер в таблице1

Create or replace trigger t1 
before insert on tab1
for each row
begin
  DECLARE
    l_exists   INTEGER;
  BEGIN
    SELECT COUNT(*) 
    INTO l_exists
    FROM tab2
    WHERE col = :new.pk1 ;    

    IF l_exists = 0
    THEN
      INSERT INTO TAB2
      values 
      (:new.pk1,:new.time_stamp,null);

    ELSE
      Update tab2
      set end_date = :new.time_stamp
      where col = :new.pk1;

     INSERT INTO TAB2
     values 
     (:new.pk1,:new.time_stamp,null);

    END IF;
  END;
end;

- Исполнение:

insert into tab1 values (1,'a',to_date('10-jul-2019','DD-MON-YYYY'));
insert into tab1 values (2,'h',to_date('11-mar-2019','DD-MON-YYYY'));
insert into tab1 values (3,'k',to_date('19-jul-2019','DD-MON-YYYY'));
insert into tab1 values (4,'j',to_date('07-nov-2019','DD-MON-YYYY'));
insert into tab1 values (5,'h',to_date('11-jul-2019','DD-MON-YYYY'));

Commit;

SQL> select * from tab1;

    ID P TIME_STAM
   ---------- - ---------
     1 a 10-JUL-19
     3 k 19-JUL-19
     4 j 07-NOV-19
     2 h 11-MAR-19
     5 h 11-JUL-19

 SQL> select * from tab2;

      C START_DAT END_DATE
      - --------- ---------
      a 10-JUL-19
      k 19-JUL-19
      j 07-NOV-19
      h 11-MAR-19 11-JUL-19
      h 11-JUL-19   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...