【发布时间】:2018-09-01 12:53:13
【问题描述】:
我需要从一个大表中删除连续重复的记录(它可能包含 200k-100 万条记录,大约 一半的记录将被删除)。 p>
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 方法,但是我不清楚这样做的影响,因为看起来我' d 需要将值从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 打开记录集,或者完全采用不同的方法,但我希望避免反复试验。
想法?谢谢!
【问题讨论】:
-
你最终解决了这个问题吗?我正在处理类似的事情。
标签: vba database ms-access duplicates file-locking