我在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
答案 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%;}