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

Oracle 外連接語法完整指南:LEFT/RIGHT/FULL JOIN 與舊式 (+) 寫法對照

     編輯:Oracle 資料庫相關知識

Oracle 支援 ANSI SQL-99 標準外連接語法(LEFT/RIGHT/FULL JOIN)與舊版專有 (+) 運算子。本文提供三種外連接的標準語法、等價舊語法、結果集語義、適用場景對照表。

1. LEFT OUTER JOIN(左外連接)

-- 標準語法(推薦)
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id;

-- 舊式 Oracle 專有語法
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);

結果: 所有員工列 + 對應部門;無部門員工的 department_name 為 NULL

2. RIGHT OUTER JOIN(右外連接)

-- 標準語法
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;

-- 舊式語法
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;

結果: 所有部門列 + 對應員工;無員工部門的 last_name 為 NULL

3. FULL OUTER JOIN(全外連接)

-- 標準語法(唯一支援全外連接的語法)
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;

結果: 所有員工 + 所有部門;雙邊無對應皆顯示 NULL

舊式 (+) **不支援** FULL OUTER JOIN,需用 LEFT JOIN UNION RIGHT JOIN 模擬,效能差且易錯

三種外連接語義對照

連接類型保留左表所有列保留右表所有列舊式 (+) 位置ANSI 關鍵字
INNER JOIN否否無INNER JOIN / JOIN
LEFT OUTER JOIN是否右表欄位加 (+)LEFT JOIN / LEFT OUTER JOIN
RIGHT OUTER JOIN否是左表欄位加 (+)RIGHT JOIN / RIGHT OUTER JOIN
FULL OUTER JOIN是是不支援FULL JOIN / FULL OUTER JOIN

多表外連接注意事項

  • 標準語法中,ON 條件決定連接邏輯,WHERE 過濾結果集,**不要將外連接表的欄位條件寫在 WHERE**(會隱性轉為內連接)
  • 舊式語法中,(+) 僅能出現在 WHERE 子句,**不可用於 OR/IN 運算子邊**,且單表最多一個 (+)
  • 建議**全面遷移至 ANSI 標準語法**,可移植、可讀、優化器支援更完善

實戰範例:三表外連接

-- 員工-部門-地點(部門可能無地點)
SELECT e.last_name, d.department_name, l.city
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
LEFT JOIN locations l ON d.location_id = l.location_id;

外連接是「保留主表、補充從表」的語義工具。掌握三種類型與標準語法,寫出正確、可維護的多表查詢。

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