2

Access 2010でVBA関数を作成して、あるテーブルの用語のリストを別のテーブルの用語のリストと比較しました。値が類似している場合(必ずしも完全に一致しているとは限りません)、一致するたびに2番目のテーブルの列の値を合計します。TableAには約150の用語があります。TableBには、関連するカウント(整数)を持つ約50,000の用語があります。

表の例:

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

VBA関数を呼び出して用語を比較し、あいまい一致がある場合はカウントを合計する単純なSQLクエリがあります。

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

私が抱えている問題は、CPUの約50%を使用していることであり、可能な限り軽量化したいと考えています。Accessを使用してこのタスクを実行するためのより効率的な方法はありますか?純粋にSQLの代替手段に移行することは、現時点ではオプションではありませんが、私は幸せになります。私はAccessやVBAの第一人者ではありませんが、パフォーマンスを向上させる明らかな何かがクエリに欠けていると感じています。

編集:

期待される結果は、あいまい一致が発生したTableBのカウント列の合計を含むTableAのすべての用語を一覧表示します。

データ例:

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モードとSQ​​L-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 に答える