首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 外部連接(Outer Join)詳解:(+)-語法與 ANSI SQL 標準對比

     編輯:Oracle 資料庫相關知識

問題場景

查詢所有員工及其部門名稱,包含「無部門」員工:

SELECT e.last_name, e.department_id, d.department_name
FROM   employees e, departments d
WHERE  e.department_id = d.department_id(+);

執行邏輯(Oracle 專有 (+) 語法)

  1. 以 employees 為驅動表(全表掃描)。
  2. 對每筆員工記錄,嘗試在 departments 找到 department_id 相同的部門。
  3. 找到 → 連接產生一行(含部門名)。
  4. 找不到 → 仍產生一行,部門相關欄位填 NULL。

結果:所有員工 + 匹配部門或 NULL。

關鍵特性

  • (+) 標記在「可為 NULL」的一方(此處 d.department_id)。
  • 僅支援等值連接(=),不支援 >、< 等非等值條件。
  • 同一查詢中,一個表最多只能有一個 (+) 出現(即不能同時左、右外連)。
  • 若 WHERE 另有條件過濾外部表欄位(如 d.location_id = 100),會隱性轉為內部連接,需將條件移至 ON 子句(ANSI 標準)或用 AND d.location_id(+) = 100。

ANSI SQL 標準寫法(推薦)

SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
LEFT JOIN departments d
  ON e.department_id = d.department_id;
  • 語義清晰:LEFT JOIN 保留左表所有行。
  • 支援複雜 ON 條件、多表外連、FULL OUTER JOIN。
  • Oracle 9i+ 完整支援,效能與 (+) 等價(優化器內部轉換相同)。

多重匹配情況

若部門表有重複 department_id(非主鍵),外連接會產生笛卡兒積,員工行數 × 匹配部門行數。若無匹配,仍產生 1 行(NULL)。

最佳實務

  1. 新代碼統一使用 ANSI LEFT/RIGHT/FULL JOIN。
  2. 維護舊代碼時,若涉及多表外連或複雜條件,重構為 ANSI 語法。
  3. 索引建在連接鍵上(departments.department_id、employees.department_id)以加速查詢。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved