在同一个表中使用select query-2更新select query-1

时间:2014-04-14 12:45:19

标签: sql oracle merge insert-update upsert

请帮忙。如何完成以下任务:

该表包含每日交易数据。目的是使用昨天的记录的计算值(在这3列中),将值更新/插入当天记录中的3列。我有最近40天的更新时间基于:

    trunc(sysdate)-39 = calculated value of trunc(sysdate)-40
    trunc(sysdate)-38 = calculated value of trunc(sysdate)-39
    trunc(sysdate)-37 = calculated value of trunc(sysdate)-36
    .
    .
    .
    .
    trunc(sysdate)= calculated value of trunc(sysdate)-1.

我的代码示例:

marge into

(select trans_date, store, item, reason, col1, col2, col3 
from tb1 where tb1.trans_date   = trunc(sysdate)) today

using 

(select trans_date, store, item, reason, col1, col2, col3 
from tb1 
where tb1.trans_date = trunc(sysdate-1)) yesterday

when matched then
update set
(today.col1 = yesterday.col1 + 1
today.col2 = decode(yesterday.reason,today.reason,today.col2+1,1)
today.col3 = yesterday.trans_date)

WHEN NOT MATCHED THEN
INSERT (today.col1, today.col2, today.col3 )
VALUES (
         1, 1, 
         (select max(trans_date) from tb1 
          where tb1.trans_date < trunc(sysdate)-1)
          and tb1.store=today.store
          and tb1.item=today.item);

请注意:每天的记录可能有以下重复。

今天:

    trans_date  store  item   reason         col1  col2  col3    ***(expected values)***

    14/04/14    999   100  'short supply'     -     -     -   ==> 2,2,13/04/14
    14/04/14    999   100  'short supply'     -     -     -   ==> 2,2,13/04/14
    14/04/14    998   101  'Damaged'          -     -     -   ==> 2,2,11/04/14
    14/04/14    990   105  'Returned'         -     -     -   ==> 2,1,13/04/14
    14/04/14    995   107  'Returned'         -     -     -   ==> 1,1,14/04/14

昨天:

    trans_date  store  item   reason         col1  col2  col3

    13/04/14    999   100  'short supply'    1  1   13/04/14  
    13/04/14    999   100  'short supply'    1  1   13/04/14 
    13/04/14    998   101  'Damaged'         1  1   11/04/14
    13/04/14    990   105  'Transferred'     1  1   13/04/14

1 个答案:

答案 0 :(得分:0)

如果需要,通常会创建一个存储过程。这会有所帮助

 create or replace procedure SP_TEST
 as 
 // declare your variables //
 cursor c is select trans_date, store, item, reason, col1, col2, col3 
  from tb1 where tb1.trans_date = trunc(sysdate-1);
 begin

    for rec in c loop
        // do your calculations //
    select count(*) into v_v1 from tb1 where tb1.trans_date = trunc(sysdate)
    if v_v1=0 then
      // do insert
    else 
       //do update
    end if;
    end loop;
  exception
         // exception part
  end;

如果您不想重复,请在游标查询中使用DISTINCT或使用表中的约束

对于历史数据,请使用类似

的内容
 create or replace procedure SP_TEST(P_DATE DATE)
 as 
 // declare your variables //
 cursor c is select trans_date, store, item, reason, col1, col2, col3 
  from tb1 where tb1.trans_date = trunc(P_DATE-1);
 begin

    for rec in c loop
        // do your calculations //
    select count(*) into v_v1 from tb1 where tb1.trans_date = trunc(P_DATE)
    if v_v1=0 then
      // do insert
    else 
       //do update
    end if;
    end loop;
  exception
         // exception part
  end;