如何仅对现有表执行查询



我使用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代码动态构建此查询。所以我有下一个逻辑:

  1. 检查表是否存在
  2. 构建查询字符串(添加到字符串"UNION ALL SELECT * FROM [Table]"&我和;"]")
  3. 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表不存在,那么它对应的本地表将是空的。)

相关内容

  • 没有找到相关文章

最新更新