如何在没有主键的表中检测/删除数据库中的重复条目?
[如果我们使用'DISTINCT'我们如何知道哪个记录是正确的并且重复一个? ]
答案 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
的副本。