2013-05-31 40 views
0

我使用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表」 &我& 「]」)
  3. 上的錯誤= 3078執行查詢(基於查詢字符串)。

它的工作原理,但它需要很多時間來檢查表是否存在(每次數據庫試圖從源鏈接此表)。我有另一種方式來做到這一點嗎?是否有可能像「長」查詢中的「部分」結果一樣返回(僅適用於那些存在並跳過另一個表的表)並且不要單獨檢查它們?

+0

您如何檢查以查看錶格是否存在? – Zaider

+0

DCount(「*」,「[Table」&i&「]」) - 我試圖計數記錄。如果table不存在,我會捕獲一個錯誤(Err.Number = 3078)並對此錯誤執行查詢。 – mbigun

回答

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 
+0

這個解決方案很好,但沒有解決我的問題。在這種情況下,我只能檢查數據庫中是否存在表,但不檢查表中是否存在HTML源。現在我有100個鏈接表,我應該對它們做一些操作來檢查這個表是否存在於HTML文件中(例如記錄數)。 – mbigun

+0

@mbigun我稍微修改了我的答案。您可以使用相同的技術來檢查表格是否存在於源位置中。 – Zaider

+0

輝煌的解決方案!通過這種方式,我只連接到HTML文件。當我第一次運行這個代碼時(我得到了結果),但是我的下一次嘗試失敗了。沒有錯誤!只是數據庫「沒有響應..」。我的OpenDatabase方法:wrk.OpenDatabase(「C:\ db \ ZVPL.htm」,False,False,「HTML Import; DSN = ZVPL Link Specification; HDR = NO; IMEX = 3; CharacterSet = 65001;」)。這很奇怪。 – mbigun

1

處理它的一種方法是創建大約100個本地表,每個表對應HTML源代碼中的每個(潛在)表。這對VBA來說很容易,因爲表結構將是相同的。你可以只做一次,然後重新使用本地表(見下文)。

然後,當你想要檢索數據的最新版本,你可以只

  • DELETE FROM本地表刪除所有現有的行

  • 運行一個循環來INSERT INTO [local Table n] SELECT * FROM [Table n]直到你「跑out「HTML表(即,當您收到錯誤時)

  • 然後運行您的UNION ALL查詢ag使用本地表。

這樣,所有的本地表將永遠存在。 (如果HTML表不存在,那麼其對應的本地表將只是空的。)

+1

好主意。而且,我不需要創建100個本地表。一張本地桌子就夠了。第一步:DELETE FROM [Local T],第二步:INSERT INTO [Local T] SELECT * FROM [Table n]直到錯誤,第三步:SELECT * FROM [Local T]。我會嘗試這個解決方案。 – mbigun

+0

是的,好點 - 只要追加到一個本地表,而不是保持分開。 –

相關問題