2

我在 Access 2010 中创建了一个 VBA 函数,用于将一个表中的术语列表与另一个表中的术语列表进行比较。如果这些值是相似的(不一定是完全匹配),我会从第二个表中的列中为每个匹配项求和。表 A 有大约 150 个术语。TableB 有大约 50,000 个具有相关计数(整数)的术语。

示例表:

TableA             TableB
---------          ----------
ID                 ID
Term               Term
                   Count

我有一个简单的 SQL 查询,它调用 VBA 函数来比较术语,如果它们有模糊匹配,则对计数求和。

SQL:

SELECT TableA.[Term], TermCheck(TableA.[Term]) AS [Term Count] FROM TableA ORDER BY 2 DESC;

VBA:

Option Compare Database

Public Function TermCheck(Term) As Long

    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("TableB", dbOpenDynaset)
    Dim ttl As Long
    ttl = 0

    With rst
        While Not .EOF
            If rst(1) Like "*" & Term & "*" Then
                ttl = ttl + rst(2)
            End If
            .MoveNext
        Wend
    End With

    rst.Close
    Set rst = Nothing

    CurrentDb.Close

    TermCheck = ttl

End Function

我遇到的问题是它使用了我大约 50% 的 CPU,我想让它尽可能轻量级。是否有更有效的方法来使用 Access 完成此任务?在这一点上,转向纯粹的 SQL 替代方案不是一种选择,尽管它会让我更开心。我不是 Access 或 VBA 专家,但我觉得我在查询中遗漏了一些可以提高性能的明显内容。

编辑:

预期的结果将列出 TableA 中的所有术语以及发生模糊匹配的 TableB 中的计数列的总和。

示例数据:

TableA
-------------
1 blah
2 foo
3 bar
4 zooba

TableB
-------------
1 blah    16
2 blah2   9
3 foo     7
4 food    3
5 bar     3

示例结果:

Term          Count
---------------------
blah          25
foo           10
bar           3
zooba         0
4

3 回答 3

1

在这些线上?

SELECT ta.ID, tb.Term, ta.Term, tb.Count
FROM ta, tb
WHERE ta.Term Like "*" & tb.term & "*";

ID  tb.Term  ta.Term  Count
2   hat      hat      2
3   hat      the hat  2
3   the hat  the hat  4
4   mat      mat      6
5   mat      matter   6
5   matter   matter   8
于 2012-06-14T16:23:55.120 回答
1
SELECT
    TableA.Term,
    Nz(subq.SumOfCount, 0) AS Count
FROM
    TableA
    LEFT JOIN
    (
        SELECT a.Term, Sum(b.Count) AS SumOfCount
        FROM TableA AS a, TableB AS b
        WHERE b.Term ALike '%' & a.Term & '%'
        GROUP BY a.Term
    )  AS subq
    ON TableA.Term = subq.Term;

编辑:我使用ALike了标准的 ANSI 通配符。这允许查询正确运行,无论它是从 SQL-89 还是 SQL-92 模式运行。如果您更喜欢 * 通配符,请使用此版本的WHERE子句:

WHERE b.Term Like '*' & a.Term & '*'

请注意,只有在 SQL-89 模式下运行时才会正确匹配。

于 2012-06-14T18:33:54.347 回答
0

我通常使用 iif 构建表达式:

TestFlag:iif([TableA]![Term] = [TableB]![Term],"Same","Different") 
于 2017-02-15T19:43:41.600 回答