如何有效地比较Access中两个表的字符串值?

时间:2012-06-14 16:12:04

标签: ms-access access-vba

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

示例表:

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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模式运行时才能正确匹配。

答案 2 :(得分:0)

我通常使用iif:

构建表达式
html, body {height: 100%;}
.container {min-height: 100%;}