需在同一查詢中關聯不同 Access 資料庫檔案 (`.mdb` / `.accdb`) 的資料表,Access SQL 支援特殊語法實現跨庫 JOIN。
SELECT * FROM 裝材類型 AS a INNER JOIN [;database=路徑/檔案名.accdb].裝材 AS b ON a.BH = b.LXBH
| 元素 | 說明 |
|---|---|
[;database=...] | 中括號包裹,database 關鍵字指定外部資料庫路徑 |
| 路徑 | 相對路徑 (相對當前連線資料庫) 或絕對路徑 |
pwd=密碼 | 可選,外部資料庫有密碼時需提供 |
| 資料表前綴 | 外部資料庫.資料表名 格式 |
<?php
try {
// 主資料庫連線
$pdo = new PDO(
"odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:/data/main.accdb;",
"", ""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 跨庫查詢
$externalDb = "C:/data/materials.accdb";
$sql = "
SELECT a.類型名稱, b.材料名稱, b.規格
FROM 裝材類型 AS a
INNER JOIN [;database=$externalDb].裝材 AS b
ON a.編號 = b.類型編號
WHERE a.啟用 = 1
";
$stmt = $pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
echo "{$row['類型名稱']} - {$row['材料名稱']} - {$row['規格']}\n";
}
} catch (PDOException $e) {
error_log("Access 查詢失敗: " . $e->getMessage());
echo "查詢錯誤,請檢查日誌";
}
// 定時任務將外部資料表同步至主資料庫
$external = new PDO("odbc:...;Dbq=$externalDb");
$main = new PDO("odbc:...;Dbq=$mainDb");
$data = $external->query("SELECT * FROM 裝材")->fetchAll();
$stmt = $main->prepare("INSERT INTO 裝材同步 (欄位...) VALUES (?, ?, ...)");
foreach ($data as $row) $stmt->execute(array_values($row));
SQL Server / PostgreSQL / MySQL 8.0+ 支援 Foreign Data Wrapper / Linked Server 進行標準跨實例查詢。
// 分別查詢再 PHP 端合併 (小資料量適用)
$types = $pdo1->query("SELECT * FROM 裝材類型")->fetchAll(PDO::FETCH_KEY_PAIR);
$materials = $pdo2->query("SELECT * FROM 裝材")->fetchAll();
foreach ($materials as &$m) $m['類型名稱'] = $types[$m['類型編號']] ?? '未知';
Access 跨庫查詢是舊系統維護時的實用技巧,新架構設計應避免跨檔案資料庫依賴,採用集中式資料庫或微服務架構。