【问题标题】:Keep first of duplicate records and delete the rest保留第一个重复记录并删除其余记录
【发布时间】:2012-04-12 08:23:35
【问题描述】:

This question 几乎完成了我想要完成的工作,但是我的表更复杂并且没有主键。我也不太明白最佳答案, t1 和 t2 是什么意思。如果这个答案适用于我,如果有人解释代码将不胜感激。

我有几个月的表格,其中包含有关客户及其持有的政策的信息。每个客户端都有一个唯一的策略 ID,但他们可以有多个策略,从而导致同一策略 ID 下的多个记录。重复记录可以在每个字段中完全不同或完全相同。

出于我的目的,我只想为每个策略 ID 保留一条记录。理想情况下,保存的记录是年龄最高的记录,但如果太复杂则不需要。请注意,可能有多个记录的年龄是该特定策略 ID 的最大值,那么我们保留哪一个并不重要。

我不打算创建主键,因为在某些情况下,我会将两条记录保存在同一个策略 ID 下,我将自己修改代码。我也不想创建另一个表,因为我正在使用 10 多个表。有人建议使用first(),但我不确定如何将其合并到查询中。

如果您需要任何其他信息,请告诉我,并提前感谢您的帮助!

=========更新#1

好的,看来我的问题有点不切实际,所以我将添加一个自动编号主键。我将如何处理?

【问题讨论】:

  • 你真的应该考虑添加一个主键,因为它可以更容易地识别单个记录,并且可以帮助你删除重复。请注意,拥有主键并不意味着您仍然不能拥有副本。
  • 我认为您将不得不在某些事情上让步。您要么需要创建一个新表,要么必须添加一个唯一键。

标签: duplicate-removal sql-delete ms-access-2003


【解决方案1】:

以下几行:

DELETE Policies.*
FROM Policies
WHERE Policies.ID Not In (
   SELECT TOP 1 id
   FROM   policies p
   WHERE  p.policyid = policies.policyid
   ORDER  BY createdate DESC, id )

【讨论】:

  • 我尝试自己运行内括号SELECT 语句,它要求我输入Policies.PolicyID 的参数值。我可以确认我理解您的代码吗? ID = 自动编号主键;政策=表格; P = 策略表。那么倒数第二行不总是正确的吗?另外,内括号只输出一条记录。
  • 这个idea使用了两个id,你文中提到的可以复制的Policy ID和ID,即新的自动编号。内括号为每个策略 id 输出一条记录,这就是您想要的结果。我用一个示例表进行了测试。
  • 哦,好吧,抱歉,我刚刚理解了代码。我在一张有 30k 条记录的表上进行了测试。它似乎工作!所以谢谢!最后一件事,查询需要很长时间才能运行 - 这正常吗?我只是担心,因为我的一张表有 90 万条记录..
  • 这样的查询不会很快。你必须经常这样做吗?
  • 不经常,这是一次研究的事情,但我有 15 张桌子要这样做,其中 14 张大约 35k,还有一张 900k 的大桌子。我正在检查我所做的测试查询 - 它大部分都做对了,但应该删除的 2 条记录仍然存在......看不到 2 条记录有什么特别之处......
猜你喜欢
  • 2015-09-27
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2018-02-17
  • 2020-05-14
相关资源
最近更新 更多