如何更改历史记录表上的历史数据

时间:2018-10-09 06:53:16

标签: sql oracle algorithm tree

我有一张带有树状结构和日期的表来跟踪更改(子项,父项,根目录,生效日期,到期日期,状态)。
但是现在我也想更改历史数据。
例如,该表现在具有这3条记录,

1 c1    p1    r1    2018-09-11    2018-09-13    NA 
2 c1    p2    r2    2018-09-13    2018-09-15    NA 
3 c1    p3    r3    2018-09-15    9999-12-01    A 

现在我们想将“ c1”的父级更改为“ p4”,其根目录为“ r4”,介于“ 2018-09-12”和“ 2018-09-14”之间。表格就是这样,

1 c1    p1    r1    2018-09-11    2018-09-12    NA 
2 c1    p4    r4    2018-09-12    2018-09-14    NA 
3 c1    p2    r2    2018-09-14    2018-09-15    NA 
4 c1    p3    r3    2018-09-15    9999-12-01    A 

关于性能,什么是针对此问题的最佳设计?

1 个答案:

答案 0 :(得分:0)

我不想详细说明您的数据模型是否正确,只需回答问题即可。如果新期间覆盖了先前的整个期间,则需要两个update日期(日期),一个insert,并且可能需要一个delete来删除行。

declare
  r data%rowtype; 
begin
  r.child  := 'c1';
  r.parent := 'p4';
  r.root   := 'r4';
  r.effective_date := date '2018-09-12';
  r.expire_date := date '2018-09-14';
  r.status := 'NA';

  delete from data 
    where r.effective_date <= effective_date and expire_date <= r.expire_date;
  update data set expire_date = r.effective_date 
    where expire_date between r.effective_date and r.expire_date;
  update data set effective_date = r.expire_date 
    where effective_date between r.effective_date and r.expire_date;
  insert into data values r;
end;

我用于测试的表:

create table data(child, parent, root, effective_date, expire_date, status) as (
    select 'c1', 'p1', 'r1', date '2018-09-11', date '2018-09-13', 'NA' from dual union all 
    select 'c1', 'p2', 'r2', date '2018-09-13', date '2018-09-15', 'NA' from dual union all 
    select 'c1', 'p3', 'r3', date '2018-09-15', date '9999-12-01', 'A'  from dual );

这些是简单的操作,如果您有日期索引,它们应该很快。您可以使用orcase when将两个更新合并为一个语句,但是我怀疑这很关键。