TTable 單表操作,TQuery 不僅支援多表 JOIN,更能跨越不同資料庫引擎(Paradox、dBase、Access、SQL Server 等)進行關聯查詢,只要系統安裝對應 ODBC 驅動與 BDE 別名即可。本文實戰演示 Paradox+dBase 異庫聯查、Access 多表跨庫聯查兩大經典場景。
DatabaseName := ''(設為空字串),讓 SQL 內的完整路徑或別名生效。Master.db (Paradox) 與 Customer.dbf (dBase) 共同擁有 CustNo 欄位。
Query1.Close;
Query1.DatabaseName := ''; // 關鍵!
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM "Master.db" A, "Customer.dbf" B WHERE A.CustNo = B.CustNo');
Query1.Open;
RSDA.mdb (含在職/離職目錄) 與 ZFGjj.mdb (住房公積金),透過「用戶號」關聯。
Database1.AliasName := 'ZFGjj'; Database1.DatabaseName := 'ZFGjj';
Database1.KeepConnection := True; Database1.Connected := True;
Database2.AliasName := 'RSDA'; Database2.DatabaseName := 'RSDA';
Database2.KeepConnection := True; Database2.Connected := True;
for I := 1 to 10 do begin
Query1.Close;
Query1.DatabaseName := '';
Query1.SQL.Clear;
Query1.SQL.Add(
'SELECT A.七月, B.個人賬號, B.用戶號, C.姓名 ' +
'FROM ":ZFGjj:個人匯繳部門表" A, ":ZFGjj:住房公積金明細表" B, ":RSDA:在職職工目錄" C ' +
'WHERE (A.用戶號 = B.用戶號) AND (B.用戶號 = C.用戶號) AND (A.部門 = :Dept) AND (B.封存 = :IsSealed)'
);
Query1.Prepare; // 解析參數
Query1.Params[0].DataType := ftInteger; // :Dept
Query1.Params[1].DataType := ftBoolean; // :IsSealed
Query1.Params[0].AsInteger := DeptArray[I];
Query1.Params[1].AsBoolean := IsSealedFlag;
Query1.Open;
// 處理結果...
end;
:ZFGjj:表名:BDE 別名語法,冒號包住別名與表名。:Dept、:IsSealed 依出現順序自動對應 Params[0]、Params[1]。Prepare 可預編譯 SQL,提升重複執行效能。只要有 ODBC 驅動並在 BDE 登錄別名,即可在同一 SQL 中混合查詢:
TQuery 異質聯查是 Delphi 早期跨平台資料整合的利器,理解其原理有助於維護舊系統或設計遷移方案。