如何只对现有表执行查询?

时间:2013-05-31 10:44:31

标签: sql ms-access linked-tables

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

  1. 检查表格是否存在
  2. 构建查询字符串(添加到字符串“UNION ALL SELECT * FROM [Table”& i&“]”)
  3. On Error = 3078执行查询(基于查询字符串)。
  4. 它可以工作,但需要花费大量时间来检查表是否存在(每次数据库尝试从源链接此表时)。我还有其他办法吗?是否有可能从“长”查询返回“部分”结果(仅适用于存在并跳过另一个表的那些表)并且不单独检查它们?

2 个答案:

答案 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表不存在,则其对应的本地表将为空。)