我正在使用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:找不到表...”。为了避免这个错误,我试图通过使用VBA代码动态构建此查询。所以我有下一个逻辑:
它可以工作,但需要花费大量时间来检查表是否存在(每次数据库尝试从源链接此表时)。我还有其他办法吗?是否有可能从“长”查询返回“部分”结果(仅适用于存在并跳过另一个表的那些表)并且不单独检查它们?
答案 0 :(得分:2)
您可以通过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
答案 1 :(得分:1)
处理它的一种方法是创建~100个本地表,一个用于HTML源中的每个(潜在)表。这对VBA来说很容易,因为表结构是相同的。你可以这样做一次,然后重新使用本地表(见下文)。
然后,当您想要检索最新版本的数据时,您可以
DELETE FROM
本地表删除所有现有行
运行循环到INSERT INTO [local Table n] SELECT * FROM [Table n]
,直到“用完”HTML表格(即收到错误时)
然后针对本地表运行 long UNION ALL
查询。
这样,所有本地表都将始终存在。 (如果HTML表不存在,则其对应的本地表将为空。)