Oracle 8i使用專有(+)外連接語法,9i起全面支援ANSI SQL-92標準語法。本文提供完整對照表與實戰範例。
CREATE TABLE test1 (a INT, b INT);
CREATE TABLE test2 (a INT, b INT);
INSERT INTO test1 VALUES (1, 456);
INSERT INTO test1 VALUES (2, 427);
INSERT INTO test2 VALUES (1, 45456);
INSERT INTO test2 VALUES (3, 45656);
| 連接類型 | Oracle 8i舊語法 | ANSI SQL-92標準(9i+) | 結果說明 |
|---|---|---|---|
| 內連接 | WHERE a.a = b.a | INNER JOIN ... ON a.a = b.a | 兩表匹配行(結果: 1行) |
| 左外連接 | WHERE a.a = b.a(+) | LEFT [OUTER] JOIN ... ON a.a = b.a | 左表全保留,右表無匹配為NULL(結果: 2行) |
| 右外連接 | WHERE a.a(+) = b.a | RIGHT [OUTER] JOIN ... ON a.a = b.a | 右表全保留,左表無匹配為NULL(結果: 2行) |
| 全外連接 | UNION左右連接 | FULL [OUTER] JOIN ... ON a.a = b.a | 雙表全保留,無匹配為NULL(結果: 3行) |
| 交叉連接 | FROM a, b無條件 | CROSS JOIN | 笛卡爾積(結果: 4行) |
-- 表A: ID, NAME | 表B: ID, CLASS
-- A: (1,IBM), (2,SONY), (3,BMW)
-- B: (1,C1), (3,C3), (4,C4)
-- INNER JOIN → (1,IBM,C1), (3,BMW,C3)
SELECT * FROM A INNER JOIN B ON A.ID = B.ID;
-- LEFT JOIN → (1,IBM,C1), (2,SONY,NULL), (3,BMW,C3)
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
-- RIGHT JOIN → (1,IBM,C1), (3,BMW,C3), (4,NULL,C4)
SELECT * FROM A RIGHT JOIN B ON A.ID = B.ID;
-- FULL OUTER JOIN → 上述三種結果合併
SELECT * FROM A FULL OUTER JOIN B ON A.ID = B.ID;
(+)語法若無Bug可暫不重構,但新增修改建議改寫(+)不可用於OR條件、IN子查詢、比較運算子兩側同時出現ON子句可包含任意複雜條件,WHERE專責過濾