2012-03-28 110 views
0

This question几乎完成了我想完成的任务,但是我的表更复杂,没有主键。我也不太了解最上面的答案,t1和t2是什么意思。如果这个答案可以适用于我,如果有人解释代码,将不胜感激。保留第一个重复的记录,并删除其余的

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

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

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

请让我知道,如果您需要任何额外的信息,并感谢您的帮助提前!

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

好吧,看起来像我的问题是有点不现实,所以我会添加一个自动编号主键。我将如何继续?在这些线路上

+2

你真的应该考虑增加一个主键,因为它使得它可以识别一个记录,以便更容易,并会帮助您删除的DUP。注意有一个主键并不意味着你不能仍然有dups。 – 2012-03-28 17:37:58

+0

我认为你将不得不放弃某些东西。要么你需要创建一个新表,要么你将不得不添加一个唯一的键。 – Fionnuala 2012-03-28 19:49:11

回答

3

东西:

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) 
+1

我试着自己运行内部的'SELECT'语句,它要求输入'Policies.PolicyID'的参数值。我能否确认我正确理解你的代码? ID =自动编号主键;政策=表格; P =政策表。第二个最后一行永远不会是真的吗?而且,内框仅输出一条记录。 – Emily 2012-03-29 14:41:47

+1

这个想法使用了两个ID,您的文本中提到的可以重复的策略ID和ID,这是新的自动编号。内括号每个策略ID输出一条记录,这就是你想要的结果。我用示例表进行了测试。 – Fionnuala 2012-03-29 14:48:21

+1

Ohhhh好的,我的道歉,我只是了解代码。我在一张带有30k记录的桌子上做了测试。它似乎工作!所以谢谢!最后一件事,查询花了很长时间才能运行 - 这是正常的吗?我只是担心,因为我的表中有一个有900k记录。 – Emily 2012-03-29 15:09:35

相关问题