-- 寫法 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;
INNER JOIN、LEFT/RIGHT JOIN 等過渡級特性,Oracle 9i 才完整支援| 維度 | WHERE 連接 | JOIN 語法 |
|---|---|---|
| 執行計畫 | 完全相同 | 完全相同 |
| 外部連接 | Oracle: (+) / SQL Server: *=(已棄用) | 標準 LEFT/RIGHT JOIN |
| 可讀性 | 條件混雜於 WHERE | 連接條件與篩選條件分離 |
| 維護性 | 複雜查詢易出錯 | 結構清晰,不易遺漏連接條件 |
| 跨平台相容 | 極佳(舊版資料庫皆支援) | 現代資料庫全支援,舊版可能不支援 |
優先使用 ANSI SQL-92 JOIN 語法,理由:
- 語義明確,連接邏輯與業務篩選分離
- 支援完整的外部連接語法,避免舊式
(+)的限制(如無法全外部連接)- 現代開發規範與 ORM 框架均採用標準 JOIN
例外場景保留 WHERE 連接:
標準 JOIN 支援括號控制連接順序:
SELECT * FROM (A INNER JOIN B ON A.id = B.id) INNER JOIN C ON A.id = C.id;
舊語法無法表達此結構,僅能依賴 WHERE 條件順序與優化器判斷。