【问题标题】:MSAccess: Diff Two Tables?MSAccess:区分两个表?
【发布时间】:2019-01-14 00:21:00
【问题描述】:

我的任务是比较 2 个 MSAccess 表。它们的结构相同,来自第 3 方数据源的 2 次连续导出,相隔 1 个月(n 和 n+1)。 10K 条记录,35 个字段。

我不一定需要知道哪些字段已更新,只需知道记录中的某些内容发生了变化。然后,我的进程将继续相应地处理目标数据库中的增量记录。

我已经识别了 n+1 个数据中的插入和删除。这将是每月一次的练习。

对开始这项任务有什么建议吗?我不希望逐个字段、逐行比较。也许相当于一个~checksum?

谢谢!

【问题讨论】:

  • 由于数据库的工作方式,您天生无法计算表的校验和,因为该表可能包含碎片页面/未提交的数据/等。当然,您可以导出为没有这些问题/功能的格式,并在导出的文件上计算校验和。
  • Erik,本身不是传统的校验和,而是用于预先计算以比较以检测包含更改的记录的其他方法。粗略示例:将一条记录的所有字段值连接到一个备注字段中,并将该长字符串与之前的长字符串进行比较以查找不匹配...
  • 注意 - 35 个字段之一已经是备注字段,因此上述想法可能无效。
  • 老实说,这只是比逐行、逐字段比较慢。我已经在几分钟内完成的 10K 记录表上使用了代码。不过,备注字段可能会减慢速度。
  • 请注意,ADODB 记录集确实提供了 .GetString 方法将整个记录集转换为格式化字符串,但是当使用主要具有数字类型的表时,这导致开销,因为 1. 转换为字符串的数字类型需要更多的存储空间,2. 它不能提前失败,两个记录集都需要完全加载到内存中,3. 它需要分配和比较 2 个非常大的字符串。我怀疑它会比逐行逐字段比较更快,但它肯定更容易编写。

标签: ms-access vba


【解决方案1】:

根据 Erik(上图)的建议,我可以确认逐个字段、逐行地遍历表格并执行比较非常快。 10K 行 x 33 个字段 = ~1-2 秒。

我需要进行的一项调整是考虑 n 或 n+1 表中插入或丢失的行。我只是加入了 [ID] 上的 2 个表,消除了任何错位,然后逐步遍历生成的记录集,比较列对。

Private Sub Command0_Click()

Dim strSQL As String
Dim rs As DAO.Recordset
Dim n, i, j As Integer

' Join the 2 tables into a single recordset, side-by-side

strSQL = "SELECT TestData.*, TestData2.* FROM TestData " & _
    "INNER JOIN TestData2 ON TestData.[ID] = TestData2.[ID];"

Set rs = CurrentDb.OpenRecordset(strSQL)

'column-by-column, row-by-row, compare pairs of columns

n = rs.Fields.Count / 2

For i = 0 To n-1
    j = i + n
    If Not rs.BOF And Not rs.EOF Then
        rs.MoveFirst
        While (Not rs.EOF)
            If Not (Nz(rs.Fields(i)) = Nz(rs.Fields(j))) Then
               Debug.Print "ID " & rs.Fields(0) & " | " & rs.Fields(i).Name & " | " & rs.Fields(i) & " <> " & rs.Fields(j)
            End If
            rs.MoveNext
        Wend
    End If
    rs.MoveFirst
Next i

MsgBox "all done"

rs.Close
Set rs = Nothing

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2014-10-30
    • 2014-04-25
    • 2010-11-30
    相关资源
    最近更新 更多