Access 預設只能查詢當前資料庫內的表,但通過 IN 子句 可在 SQL 中直接引用外部資料庫文件(.mdb/.accdb),實現跨庫表連接查詢,無需建立鏈接表或編寫 VBA 代碼。
SELECT * FROM [TableName] IN '[Path\To\External.mdb]'
[] 包裹表名與路徑,防止空格/保留字衝突。\\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;
若路徑由用戶選擇,可構建動態 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 實現企業級異構數據整合。