我有一张带有树状结构和日期的表来跟踪更改(子项,父项,根目录,生效日期,到期日期,状态)。
但是现在我也想更改历史数据。
例如,该表现在具有这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
关于性能,什么是针对此问题的最佳设计?
答案 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 );
这些是简单的操作,如果您有日期索引,它们应该很快。您可以使用or
和case when
将两个更新合并为一个语句,但是我怀疑这很关键。