我需要从一个大表中删除连续的重复记录(它可能包含200k-100万条记录,大约一半的记录将被删除)。
DateTime
是独一无二的。应删除剩余字段与先前记录匹配的记录,留下“第一”记录。 (非连续重复应保留。)
DateTime Field1 Field2 Field3
-------------------- -------- -------- --------
2018-09-01 5:20:33 123 456 789
2018-09-01 5:20:34 123 456 789 ← delete
2018-09-01 5:20:35 123 654 987
2018-09-01 5:20:36 234 567 890
2018-09-01 5:20:37 234 567 890 ← delete
2018-09-01 5:20:38 234 567 890 ← delete
2018-09-01 5:20:39 123 456 789
我正在遍历记录集(按日期排序)以删除重复项,但是当我达到大约9,500个删除时,我得到:
Error 3052: File sharing lock count exceeded. Increase MaxLocksPerFile registry entry.
根据these instructions,我可以增加注册表中的值,或使用SetOption
方法,但是我不清楚这样做的影响,因为看起来我需要将9,500
的值增加到至少500,000
或更多......我不确定,但这似乎是一个坏主意。
我的代码的简化版本:
Sub example_DelDupes()
Dim rs As Recordset, delCount As Long, rCount as long
Dim thisRecord As String, prevRecord As String
Set rs = CurrentDb.OpenRecordset("select * from myTable order by DateTime")
With rs
.MoveLast 'so I can get a recordcount...
.MoveFirst
rCount = .RecordCount '...required for progress bar (not shown)
Do While Not .EOF
thisRecord = !field1$ & !field2$ & !field3$ 'actually
If thisRecord = prevRecord Then
.Delete 'delete this record
delCount = delCount + 1
Else
prevRecord = thisRecord
End If
.MoveNext
Loop
.Close
End With
Set rs = Nothing
End Sub
我认为从我正在迭代的集合中删除可能是问题,所以我没有尝试将记录标记为要删除,而是在循环完成后删除它们,但是编辑产生了与删除相同的错误,而不是.Delete
。
我怀疑可能有更好的方法来完成我的任务,也许是通过用different LockTypeEnum
打开记录集,或者完全采用不同的方式,但我希望避免反复试验。
思考?谢谢!
我将删除单个查询中的所有内容,而不是迭代记录集。
您可以使用嵌套子查询来测试该行是否满足您的条件:
DELETE o.*
FROM MyTable o
WHERE EXISTS(
SELECT 1
FROM MyTable i
WHERE o.Field1 = i.Field1 And o.Field2 = i.Field2 AND o.Field3 = i.Field3
AND EXISTS (
SELECT 1
FROM MyTable i2
WHERE i2.DateTime < o.DateTime
HAVING Max(i2.DateTime) = i.DateTime
)
)