代码之家  ›  专栏  ›  技术社区  ›  ashleedawg

删除连续的重复项:在9k(共1m条记录)处“超过文件共享锁计数”

  •  2
  • ashleedawg  · 技术社区  · 7 年前

    删除连续副本 一半的记录将被删除

    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                     
    

    我正在遍历记录集(按日期排序)以删除重复项,但当我达到大约9500次删除时,我得到:

    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 ,或者用一种完全不同的方式来处理这个问题,但我希望避免尝试和错误。

    思想?谢谢! img

    1 回复  |  直到 5 年前
        1
  •  3
  •   Erik A    7 年前

    可以使用嵌套子查询测试前一行是否满足条件:

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