我使用MS Access 2003,我有一个"长"查询,如
SELECT * FROM [Table 1]
UNION ALL
SELECT * FROM [Table 2]
UNION ALL
SELECT * FROM [Table 3]
....
SELECT * FROM [Table 100]
每个表链接到一个特定的表从HTML文件。有时我的HTML源文件包含不同数量的表-少于100,当然我的查询在执行时返回错误"3078:Cannot find Table…"。为了避免此错误,我试图通过使用VBA代码动态构建此查询。所以我有下一个逻辑:
- 检查表是否存在
- 构建查询字符串(添加到字符串"UNION ALL SELECT * FROM [Table]"&我和;"]")
- On Error = 3078执行查询(基于查询字符串)。
它可以工作,但是需要花费很多时间来检查表是否存在(每次数据库试图从源链接这个表)。还有别的方法吗?是否有可能从"长"查询中返回"部分"结果(仅适用于那些存在并跳过另一个表的表)并且不单独检查它们?
您可以通过TableDef
选项访问您的表,而不是试图计算每个表中有多少条记录。这将使您构建查询的速度比查询每个表以查看它是否存在更快。它确实要求你的表是当前链接的。
Dim db as DAO.Database
Dim wrk as DAO.Workspace
Dim tdf as DAO.TableDef
Set wrk = DBEngine.Workspaces(0)
Set db = wrk.OpenDatabase(databasePath, False, False, connection type/password)
For Each tdf in db.TableDefs
'Add it to your query string here.
Next
db.close
wrk.close
Set tdf = Nothing
Set db = Nothing
Set wrk = Nothing
处理它的一种方法是创建约100个本地表,每个表对应HTML源中的(潜在的)表。这在VBA中很容易做到,因为表结构是相同的。您可以只这样做一次,然后重用本地表(见下文)。
然后,当您想要检索最新版本的数据时,只需
-
DELETE FROM
删除本地表现有的所有行 -
运行一个循环到
INSERT INTO [local Table n] SELECT * FROM [Table n]
,直到你"用完"HTML表(即,当你收到一个错误) -
然后对本地表运行long
UNION ALL
查询。
这样,所有的本地表永远存在。(如果HTML表不存在,那么它对应的本地表将是空的。)