代码之家  ›  专栏  ›  技术社区  ›  Scott Hoffman

从历史表中获取关联行

  •  0
  • Scott Hoffman  · 技术社区  · 17 年前

    如果你有一个表,它保存了另一个表的历史记录(更新、删除),如果它是在删除操作之后出现的,你会如何拉取相关的更新行?

    表中有以下与数据无关的列
    ID int,--标识
    OP varchar——编码为“D”或“U”的删除或更新操作
    Removed_Date--从“Live”表中删除该行的日期

    我试过这样的东西
    选择*
    如表1所示
    将历史表作为表2连接到表1.Removed_Date,类似于表2.Removed_Date

    这导致表中的一行有多行(十行或更多)重复项。

    2 回复  |  直到 17 年前
        1
  •  0
  •   edosoft    17 年前

    如果你绝对确定删除和相应更新的时间戳是相同的,你可以这样做:

    select *
    from historytable as table1
    inner join historytable as table2 on table1.Removed_Date = table2.Removed_Date 
    where table1.OP = 'D' 
    and table2.op = 'U'
    

    如果时间戳不相同,并且您没有其他方法来确定哪个UPDATE跟在哪个DELETE之后,您所能做的就是检索DELETE之后的第一个UPDATE。

    select t1.*, 
      (select top 1 id 
      from historytable t2 
      where t2.Removed_Date > t1.Removed_Date
      and t2.code = 'U')
    from historytable t1 where code = 'D'
    

    -爱德华

        2
  •  0
  •   Scott Hoffman    17 年前

    以下是我在Perl中完成的任务:

    而(<>){
    @cols=拆分(/,/);
    $removeby=$cols[3];
    if($cols[1]eq“D”和$removeby!~/ottr|hksys/){
    if($保持){
    @oldCols=拆分(/,/,$hold);
    $oldRemoveBy=$oldCols[3];
    if($removeby eq$oldRemoveBy){
    打印$hold;
    印刷;
    }
    $hold=“”;
    }
    $hold=“”;
    }其他{
    $hold=$_;
    }
    }

    这不是一个万无一失的解决方案,但似乎奏效了。