【问题标题】:How can I clear out duplicate entries in an archived records table如何清除存档记录表中的重复条目
【发布时间】:2015-05-26 13:30:51
【问题描述】:

一些背景信息:我正在为一家公司更新一个应用程序,我们有一个网格视图,其中包含多个列,从标签到文本字段再到下拉列表。 gridview 中的每一行都用于驻留在我的“条目”表中的不同“条目”。当用户更改这些列之一(更新下拉列表中选择的值、更改文本字段中的文本等)时,他们正在单击“更新按钮”,然后将所做的更改插入到我们的“EntryLog”表中。这就是我们归档对特定条目所做的所有更改的方式。问题是,更新过程的旧实现将为该页面的网格视图中的所有条目创建存档记录,即使用户实际上只更新了一个条目。这意味着当用户更新一个条目时,我们的“EntryLog”表会被其他存档记录淹没,这些记录实际上与前一个相同(这意味着该条目实际上没有任何更改)

关于问题:我已经解决了这个问题,方法是实现只为修改过的 gridview 中的单行创建存档记录的功能,但现在我只剩下清理任务了所有这些错误存档记录的“EntryLog”表。如果我不得不用英语表达我想要做的事情,我会说:我想删除所有日志(通过 LogID [每个存档条目的唯一 ID] ),其中每个列值与以前的 Log 列值相同并且具有相同的“EntryID”(每个 ENTRY 本身的唯一 ID,这意味着“EntryLog”表中每个 EntryID 的实例很多。)

我什至不确定如何开始在 T-SQL 中安全地表达这一点,我们将不胜感激任何朝着正确方向提供的帮助或推动。

【问题讨论】:

  • 有什么代码可以显示吗?这将帮助我们帮助您
  • @MickyDuncan 我的 c# 代码不需要任何帮助,因为我的 gridview 上的更新按钮本身的功能已更新以执行正确的操作,我现在要解决的问题是只需清理我的 EntryLog 表中所有错误存档的记录,所以我真的没有任何相关代码可以显示,因为我还不确定如何尝试(在 T-SQL 中)我试图用英语表达的内容我的问题。如果有任何其他方式可以让我更清楚我想要做什么,请告诉我

标签: c# mysql asp.net sql-server tsql


【解决方案1】:

使用CHECKSUM() 函数查看数据是否相同,无需检查每一列。

假设你有这样的东西:

create table #t (log_id int, c varchar(10), d int, log_date date)

insert #t values
(1, 'aaaaa', 1, '20140101'),
(1, 'aaaaa', 1, '20140102'),
(1, 'aaaaa', 1, '20140103'),
(1, 'bbbbb', 1, '20140104'),
(2, 'ccc', 10, '20140103'),
(2, 'cdd', 10, '20140105')

第二行和第三行的数据是重复的。要清理数据,请执行以下语句:

with x as (
select *, row_number() over(partition by log_id, checksum(log_id, c, d) order by log_date) as rn
from #t
)
delete x where rn > 1

【讨论】:

  • 谢谢院长!由于没有任何事情像看起来那么简单,我现在意识到我的表中的两个字段是唯一的 ID,它们是另外两个表的主键,它们本质上都只是 cmets。因此,现在我必须弄清楚如果所有其他字段都相同,即使它仅与该 ID 相关,如何检查上一个存档中的 cmets 是否相同,并尝试保持合法的评论更改完整,如果它们是有效的在其他表中。对我来说肯定有点压力,但你的问题会帮助很多,所以谢谢!
【解决方案2】:

由于您想要做的就是删除重复记录,如果我没有误解,并且从我读到的内容中,它们都是唯一的 ID,您可以使用 delete query 按行 ID 删除,如下所示:

DELETE FROM <TableName>
WHERE <ID>= <value>;

由于您确实指定它一次创建了很多重复项,您可能希望使用指定的range 查看参数以更快地删除它们。看起来像这样:

DELETE FROM <TableName>
WHERE <ID> BETWEEN <value1> AND <value2>;

【讨论】:

  • 我要删除此“EntryLog”表中的一行的唯一方法是,如果所有列(除了 EntryLogID,因为它们都是唯一的)都与具有相同的 EntryID。问题是在很多情况下,EntryID 与之前的日志条目相同,但它可能是“有效存档”,因为其他(几个)列之一具有不同的值,这意味着有人实际上更改了该特定记录我想保留该档案信息。我希望这是有道理的,我发现很难清楚地描述这一点。
  • 我不太清楚每条记录有多少列,大致要检查多少条记录。但是您可以使用您知道应该删除的行的 EntryLogID 来删除它们。不幸的是,如果有很多行和/或行有很多列,这将变得相当麻烦。但我不知道关于 sql 的那些我知道让它检查查询中的行的东西,所以这就是我能提供的所有帮助。
  • @LeoStotch 在看到院长的遮阳篷后,我想我会尝试一下(因为它将来也可能对我有用)并且它确实有效 + 你可以指定你的专栏希望它检查重复项。您只需将 #t 更改为您的表名,将 log_id (2X),c 和 d 更改为您拥有的列名。当然你可以添加更多的列。所以这很可能是您要查找的查询。
  • 是的,看起来它可能就是我要找的东西!在我接受它作为我的解决方案之前,我将做一些测试,因为我有超过 300,000 行数据,我想绝对确定我不会错误地删除有效档案。谢谢!
  • @LeoStotch 我也在使用的数据库即时通讯上尝试了它,我只提供了很少的列来验证,所以至少必须有几个重复的,它只删除了 100 多个中的 21 个行,所以它不会删除所有等。我认为只要指定所有列就可以了。但为安全起见,做一个备份永远不会有坏处
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2019-01-28
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多