从历史表中获取关联的行

时间:2009-01-21 14:33:33

标签: sql-server

如果您有一个表,其中包含来自另一个表的历史记录(更新,删除),那么如果在删除操作之后出现相关更新行,您将如何提取?

表格包含以下与数据无关的栏目 ID int, - 身份
OP varchar - 编码为“D”或“U”的删除或更新操作 Removed_Date - 从“实时”表格中删除行的日期

我尝试过这样的事情 选择*
从历史表中作为表1 将historytable作为table2加入table1.Removed_Date,如table2.Removed_Date

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

2 个答案:

答案 0 :(得分:0)

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

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'

-Edoode

答案 1 :(得分:0)

以下是我最终在Perl中所做的事情:

while(<>){
        @cols = split(/,/);
        $ removeby = $ cols [3];
        if($ cols [1] eq“D”和$ removeby!〜/ ottr | hksys /){
                if($ hold){
                        @oldCols = split(/,/,$ hold);
                        $ oldRemoveBy = $ oldCols [3];
                        if($ removeby eq $ oldRemoveBy){
                                print $ hold;
                                打印;
                        }
                        $ hold =“”;
                }
                $ hold =“”;
        其他{
                $ hold = $ _;
        }
}

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