【问题标题】:How to change historical data on a history table如何更改历史表上的历史数据
【发布时间】:2018-10-09 06:53:16
【问题描述】:

我有一个带有树状结构和日期的表来跟踪更改(子、父、根、有效日期、过期日期、状态)。
但现在我也想更改历史数据。
例如表现在有这 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 

现在我们想在“2018-09-12”和“2018-09-14”之间将“c1”的父级更改为“p4”,根为“r4”。所以表格会是这样的,

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 

就性能而言,解决这个问题的最佳设计是什么?

【问题讨论】:

  • 我不明白。历史表显示过去数据的历史。为什么要操纵数据?如果你过去没有做过某事,你就不能说你做过。我认为这在 Oracle 中是不可能的
  • 作为替代方案,您可以构建自己的日志机制,将更改写入表。
  • @hotfix 我们使用这些分组数据并根据它们制作报告,但例如一年后我们发现它们存在错误并希望修复数据并再次制作报告。
  • 如果您这样做,您的数据审核员应该会变得白发苍苍。

标签: sql oracle algorithm tree


【解决方案1】:

我不想详细说明您的数据模型是否正确,只需回答问题即可。您需要两个 updates 日期,一个 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 将两个更新合并到一个语句中,但我怀疑它是否至关重要。

【讨论】:

  • 谢谢思考,但问题是当 c1 有一个子树时,当我们纠正改变根的 c1 父级时,所有的后代都必须改变
  • 好的。也许如果您编辑查询并举例说明此根更改如何应用于其他行,我们将能够回答。它可能在选择时更新。
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多