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

Oracle 外部聯結(Outer Join)完整解析:(+ ) 符號用法與執行邏輯

     編輯:Oracle 資料庫基礎

在 Oracle 傳統語法中,外部聯結透過在 WHERE 條件的欄位後加上 (+) 符號來表示。許多初學者對其運作方式感到困惑,本文將透過實例詳細解析。

範例 SQL 與結果說明

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

執行結果: 回傳所有員工資料,包含沒有對應部門編號的員工。對於無對應部門的員工,d.department_name 會顯示 NULL。

執行邏輯深度解析

這是一個以 employees 為主表(驅動表)的左外部聯結。Oracle 的執行流程如下:

  1. 掃描 employees 表中的每一筆員工記錄。
  2. 對於每位員工,嘗試在 departments 表中尋找 department_id 相符的部門。
  3. 找到相符部門: 產生一筆聯結記錄,包含 e.last_name, e.department_id, d.department_name。
  4. 找不到相符部門: 同樣產生一筆記錄,但 d.department_name 為 NULL,其他員工欄位保留原值。

關鍵觀念釐清

  • 非對稱性: (+) 放在哪一邊,哪一邊就是「可能缺少資料」的那張表(被外部聯結的表)。範例中 d.department_id(+) 表示 departments 表允許無對應資料。
  • 非過濾: 主表(employees)的所有資料都會保留,不會因無對應部門而被過濾掉。
  • 多重匹配: 若聯結條件非唯一鍵,主表單筆記錄可能對應多筆從表記錄,產生多行結果;但若完全無匹配,僅產生單一行(從表欄位為 NULL)。

現代寫法建議

Oracle 9i 起支援 ANSI SQL:1999 標準語法,建議改用更清晰的 LEFT JOIN:

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

標準語法可讀性更高,且避免 (+) 符號的諸多限制(如無法搭配 OR 條件、無法進行全外部聯結等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved