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

Oracle JOIN語法全解析:從Oracle 8i舊語法到ANSI SQL標準

     編輯:Oracle 資料庫基礎

內連接、外連接、交叉連接完整語法對照與遷移指南

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.aINNER 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.aRIGHT [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行)

ANSI語法實戰範例(含複雜條件)


-- 表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;

遷移建議與最佳實踐

  1. 新開發專案強制使用ANSI語法:可讀性高、可移植、支援複雜連接條件
  2. 舊系統維護:既有(+)語法若無Bug可暫不重構,但新增修改建議改寫
  3. 避坑指南:
    • 舊語法(+)不可用於OR條件、IN子查詢、比較運算子兩側同時出現
    • ANSI語法ON子句可包含任意複雜條件,WHERE專責過濾
    • 多表連接時,ANSI語法連接順序與邏輯更清晰
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved