通过单个查询更新并插入表中

时间:2019-07-06 09:27:23

标签: sql oracle

表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先前相同值的结束日期,并将一个具有空结束日期的新值添加到表1中2(表1和表2中的示例值H)。

我们只需要使用单个查询即可。

通过合并,我们将无法获得

1 个答案:

答案 0 :(得分:2)

  

如果将新值输入表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