如何解决根据条件查询 4 个大型 Access 表中的 1 个的最有效方法使用 VBA 模块
在过去的几周里,我一直在为我的工作中的一个问题制定一种非常规的解决方案。我快到了,但我需要知道完成最后一步的最有效方法。我会把它简单化,这样我就不必写一篇文章来描述我一直在研究的问题的疯狂性质。
我在 MS Access 中有四个大型本地表,总共有超过 500,000 条记录。 每个表代表不同类型的产品。 table1 的 productID 总是以“9”开头 table2 的 productID 总是以“8”开头 table3 的 productID 总是以“4”开头 table4 的 productID 总是以“3”开头 我编写了一个 vba 程序,它完全符合我的需要,但到目前为止我只使用 table1 查询信息。基本上,用户输入产品ID,过程在表中搜索该记录并将信息发送到共享点列表。在我的情况下,执行速度非常重要。那么,让它运行的最快方法是什么?我应该写一个声明,说“如果 ID 以 9 开头,则搜索此表,ElseIF ..... 等等。”或者,我应该将所有表合并为一个而不是查看 ID 的第一个数字?
我知道这听起来像一个简单的问题,但相信我,这是对真正问题的过度简化,需要 2,000 字才能解释它实际上是多么荒谬;我不是在开玩笑。但是,我相当有信心,上述问题的答案将为我提供成功完成此项目所需的所有信息。我已经走了这么远,剩下的就是找出将它应用到其他 3 个表的最有效方法。
谢谢!
解决方法
由于表是本地的,所以使用非常快的 Seek
方法:
如果表已链接,您仍然可以通过打开后端数据库来使用 Seek
。这是一个例子:
Function SeekTable()
Const cstrTable As String = "tblValue01"
Const cstrAttached As String = ";DATABASE="
Dim wks As Workspace
Dim dbs As Database
Dim tdf As TableDef
Dim rst As Recordset
Dim strConnect As String
Dim strTablename As String
Set wks = DBEngine(0)
Set dbs = wks(0)
Set tdf = dbs.TableDefs(cstrTable)
strConnect = tdf.Connect
strTablename = tdf.SourceTableName
Set tdf = Nothing
If InStr(1,strConnect,cstrAttached,vbBinaryCompare) = 1 Then
strConnect = Mid(strConnect,Len(cstrAttached) + 1)
' Open database shared and read-only.
Set dbs = wks.OpenDatabase(strConnect,False,True)
Set rst = dbs.OpenRecordset(strTablename)
'
' Perform Seek operation. Example.
rst.Index = "ID"
rst.Seek "=",10010
Debug.Print rst!Value
'
rst.Close
Set rst = Nothing
End If
dbs.Close
Set dbs = Nothing
Set wks = Nothing
End Function
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。