測試資料準備
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);
COMMIT;
Oracle 8i 傳統語法(舊式 Outer Join)
| Join 類型 | 語法 | 結果說明 |
| Inner Join | WHERE a.a = b.a | 僅回傳雙方皆有匹配的列 (a=1) |
| Left Join | WHERE a.a = b.a(+) | 保留 test1 全部,test2 無匹配則為 NULL |
| Right Join | WHERE a.a(+) = b.a | 保留 test2 全部,test1 無匹配則為 NULL |
| Full Join | WHERE a.a = b.a(+) UNION WHERE a.a(+) = b.a | Oracle 8i 無 FULL OUTER JOIN 語法,需用 UNION 模擬 |
| Cross Join | FROM test1, test2 | 笛卡兒積,無 WHERE 條件 |
Oracle 9i+ ANSI SQL:1999 標準語法(推薦)
-- 1. INNER JOIN
SELECT * FROM A INNER JOIN B ON A.ID = B.ID;
-- 結果:ID=1,3 (雙方皆存在)
-- 2. LEFT [OUTER] JOIN
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
-- 結果:A 全部 (1,2,3);B 無匹配顯示 NULL
-- 3. RIGHT [OUTER] JOIN
SELECT * FROM A RIGHT JOIN B ON A.ID = B.ID;
-- 結果:B 全部 (1,3,4);A 無匹配顯示 NULL
-- 4. FULL OUTER JOIN
SELECT * FROM A FULL OUTER JOIN B ON A.ID = B.ID;
-- 結果:A+B 全部 (1,2,3,4);無匹配處為 NULL
範例資料與結果對照
表 A
表 B
各 Join 結果摘要
- INNER JOIN:(1, IBM, C1)、(3, BMW, C3)
- LEFT JOIN:(1, IBM, C1)、(2, SONY, NULL)、(3, BMW, C3)
- RIGHT JOIN:(1, IBM, C1)、(3, BMW, C3)、(4, NULL, C4)
- FULL OUTER JOIN:以上四筆全包含
遷移建議與最佳實務
- 全面改用 ANSI 語法:可讀性高、可移植、支援 FULL OUTER JOIN,Oracle 9i 起完整支援。
- 避免混用舊新語法:同一查詢中混用
(+) 與 JOIN ... ON 易產生邏輯錯誤。
- 複雜多表 Join 時:建議使用 CTE (WITH 子句) 逐步建構,再以 ANSI JOIN 串接,維護性最佳。