首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Access 跨資料庫查詢實戰:IN 子句實現異庫表連接

     編輯:MySQL 資料庫相關知識

Access 預設只能查詢當前資料庫內的表,但通過 IN 子句 可在 SQL 中直接引用外部資料庫文件(.mdb/.accdb),實現跨庫表連接查詢,無需建立鏈接表或編寫 VBA 代碼。

語法核心

SELECT * FROM [TableName] IN '[Path\To\External.mdb]'
  • 方括號 [] 包裹表名與路徑,防止空格/保留字衝突。
  • 路徑支持相對路徑、UNC 網絡路徑(\\Server\Share\db.mdb)。
  • 若外部庫有密碼:IN '' [;PWD=password]。

實戰案例:內部表關聯外部庫存表

場景:當前庫 MaterialType(物料類型),外部庫 Material.mdb 含 Material 表(物料明細),通過 TypeID 關聯。

SELECT mt.TypeName, m.MaterialCode, m.MaterialName, m.StockQty
FROM MaterialType AS mt
INNER JOIN [Material] IN 'C:\Data\Material.mdb' AS m
    ON mt.TypeID = m.TypeID
WHERE m.StockQty > 0
ORDER BY mt.TypeName, m.MaterialCode;

進階:動態路徑參數化(VBA 配合)

若路徑由用戶選擇,可構建動態 SQL:

Dim dbPath As String, sql As String
dbPath = "C:\Data\Material.mdb"  ' 或從 FileDialog 獲取

sql = "SELECT mt.TypeName, m.MaterialCode, m.StockQty " & _
      "FROM MaterialType AS mt " & _
      "INNER JOIN [Material] IN '" & dbPath & "' AS m " & _
      "ON mt.TypeID = m.TypeID"

CurrentDb.Execute sql  ' 或作為記錄源賦給表單/報表

密碼保護資料庫連接

-- 靜態 SQL
SELECT * FROM [Orders] IN '' [;PWD=Secret123]  -- 注意雙單引號表示空路徑前綴

-- VBA 動態
sql = "SELECT * FROM [Orders] IN '" & dbPath & "' [;PWD=" & txtPwd & "]"

前置條件與限制

條件說明
引擎兼容外部庫必須為 Jet/ACE 格式(.mdb/.accdb),不支持 SQL Server、Oracle 等 ODBC 源。
權限當前用戶需對外部文件有讀取權限;網絡路徑需 SMB 訪問權限。
性能跨文件連接無索引統計信息共享,大表連接建議先導入本地臨時表。
並發Jet/ACE 引擎文件級鎖定,高並發寫入易衝突,僅適合輕量級讀多寫少場景。

替代方案對比

方案優點缺點適用場景
IN 子句無需建立對象、SQL 直觀、部署簡單性能一般、不支持非 Access 源臨時分析、報表、小數據量跨庫
鏈接表對象化管理、支持 ODBC 異構源、可建立索引需維護連接字符串、部署較繁瑣長期固定的跨庫應用
ADO/VBA 代碼完全控制連接、事務、參數化開發維護成本高複雜業務邏輯、批量數據同步

總結

Access IN 子句是輕量級跨庫查詢的利器,適合「臨時分析、定期報表、小數據量整合」場景。生產級應用建議遷移至 SQL Server 等客戶端-服務器架構,利用 Linked Server、OPENQUERY、OPENROWSET 實現企業級異構數據整合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved