面试 - 检测/删除重复的条目

时间:2011-10-04 14:29:30

标签: sql

如何在没有主键的表中检测/删除数据库中的重复条目?

[如果我们使用'DISTINCT'我们如何知道哪个记录是正确的并且重复一个? ]

3 个答案:

答案 0 :(得分:3)

delete f
from
(
    select ROW_NUMBER() 
        over (partition by 
            YourFirstPossibleDuplicateField,
            YourSecondPossibleDuplicateField
            order by WhateverFieldYouWantSortedBy) as DelId
    from YourTable
) as f
where DelId > 1

答案 1 :(得分:0)

我创建了一个视图,其中DISTINCT实际上不是查询的一部分,而是PARTITION。我需要最近的具有相同Ordernum和RecordType字段的记录条目,丢弃其他字段。分区按日期排序,然后选择顶行,如下所示:

SELECT *, ROW_NUMBER() 
OVER (PARTITION BY OrderNum, RecordType ORDER BY DateChanged DESC) rn
FROM HistoryTable SELECT * FROM q WHERE rn = 1

答案 2 :(得分:0)

  

如果我们使用'DISTINCT',我们如何知道哪条记录是正确的   并重复一个?

如果您有重复的行,那么选择哪个副本并不重要,因为它们都是相同的!

我想当你说“没有主键”时你实际上意味着没有简单的单列'代理'候选键,例如递增的整数序列,最好是没有间隙,但是有一个多 - 列复合'自然'候选键(尽管不包括所有列)。

如果是这种情况,你会寻找破坏关系的东西,例如:根据@ Dave的回答,列为DateChanged的列。否则,您需要选择任意行,例如@ Surfer513的答案是使用ROW_NUMBER()上的(YourFirstPossibleDuplicateField, YourSecondPossibleDuplicateField)窗口函数(即您的自然键)然后选择任意分配了行号1的副本。