【问题标题】:Get associated row from history table从历史表中获取关联行
【发布时间】:2009-01-22 01:26:58
【问题描述】:

如果您有一个包含另一个表的历史记录(更新、删除)的表,如果关联的更新行发生在删除操作之后,您将如何提取它?

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

我尝试过类似的方法
选择 *
从历史表作为 table1
在 table1.Removed_Date 上将 historytable 作为 table2 加入 table2.Removed_Date

这会导致表格中的一行出现多行(十个或更多)重复项。

【问题讨论】:

  • “关联”是指用户对之前删除的 SAME 记录执行了更新吗?或者,您是否正在寻找在删除记录后对任何记录执行的第一次更新?
  • 我正在寻找一种方法来识别合并,所以说人 A 和人 B 被识别为同一个人(也许一个记录有一个昵称)。应用程序将其存储为删除然后更新。
  • 然后,您需要历史记录表中的一个或多个字段,您可以使用这些字段来确定此删除操作和此更新操作是对属于同一逻辑人的记录执行的。
  • 另外,不应该是删除和插入(如何更新已删除的记录)?
  • 嗯,这不是我写的应用程序。我同意它似乎设计得很糟糕。对于合并操作,A 的记录被删除,B 的记录被保留。

标签: sql-server


【解决方案1】:

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

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 个值的行。无论如何,谢谢!
  • 如果您能提供一些历史表的示例行,我可能会提供帮助。
【解决方案2】:

这是我最终在 Perl 中所做的:

而 () {
@cols = split(/,/);
$removeby = $cols[3];
if ($cols[1] eq "D" and $removeby!~/ottr|hksys/) {
如果 ($hold) {
@oldCols = split(/,/,$hold);
$oldRemoveBy = $oldCols[3];
if ($removeby eq $oldRemoveBy) {
打印 $hold;
打印;
}
$hold = "";
}
$hold = "";
} 其他 {
$持有 = $_;
}
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2020-04-19
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多