關於兩表連接,常見兩種寫法:
-- 寫法 1:舊式 WHERE 連接(ANSI SQL-86)
select A.c1, A.c2, B.c1, B.c2
from table1 A, table2 B
where A.id = B.id
-- 寫法 2:標準 JOIN 連接(ANSI SQL-92)
select A.c1, A.c2, B.c1, B.c2
from table1 A join table2 B
on A.id = B.id
哪種更好?現代開發提倡哪種?
標準演進的歷史脈絡
- ANSI SQL-86:早期 Oracle、DB2、Informix 等支援的舊標準,使用逗號分隔表、WHERE 子句指定連接條件。
- ANSI SQL-92:引入
INNER JOIN、LEFT JOIN 等顯式連接語法,屬「過渡級」標準。Oracle 8i 仍不支援,直到 9i 才完整實現;SQL Server、Sybase 較早支援。
- 關鍵點:ANSI 標準分四級(入門、過渡、中級、完整),資料庫通常只需符合入門級。
INNER/LEFT JOIN 屬過渡級,並非強制。
性能與風險權衡
- 性能完全一樣:優化器生成的執行計畫無差異。
- 可維護性:ANSI-92 語法(寫法 2)結構清晰,連接條件與篩選條件分離,不易出錯,推薦用於新專案。
- 跨平台遷移風險:若涉及多種資料庫平台整合,舊式寫法(寫法 1)在雙表場景下相容性更安全,因為所有主流資料庫都支援 ANSI-86。
總結建議
- 追求優雅、易維護、不易出錯 → 首選 ANSI-92 JOIN 語法。
- 需考慮異構資料庫遷移/整合風險 → 雙表場景可用舊式 WHERE 連接。
- 隨著 ANSI 標準持續修訂(遞歸、對象、陣列、XML 等特性陸續實現),現代資料庫對標準語法支援度越來越高。