首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle JOIN 語法全攻略:從舊式 (+) 到 ANSI 標準語法完整對照

     編輯:Oracle 資料庫基礎

測試資料準備

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 JoinWHERE a.a = b.a僅回傳雙方皆有匹配的列 (a=1)
Left JoinWHERE a.a = b.a(+)保留 test1 全部,test2 無匹配則為 NULL
Right JoinWHERE a.a(+) = b.a保留 test2 全部,test1 無匹配則為 NULL
Full JoinWHERE a.a = b.a(+) UNION WHERE a.a(+) = b.aOracle 8i 無 FULL OUTER JOIN 語法,需用 UNION 模擬
Cross JoinFROM 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

IDNAME
1IBM
2SONY
3BMW

表 B

IDCLASS
1C1
3C3
4C4

各 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:以上四筆全包含

遷移建議與最佳實務

  1. 全面改用 ANSI 語法:可讀性高、可移植、支援 FULL OUTER JOIN,Oracle 9i 起完整支援。
  2. 避免混用舊新語法:同一查詢中混用 (+) 與 JOIN ... ON 易產生邏輯錯誤。
  3. 複雜多表 Join 時:建議使用 CTE (WITH 子句) 逐步建構,再以 ANSI JOIN 串接,維護性最佳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved