Oracle 支援 ANSI SQL-99 標準外連接語法(LEFT/RIGHT/FULL 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
-- 標準語法
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
-- 標準語法(唯一支援全外連接的語法)
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 運算子邊**,且單表最多一個 (+)-- 員工-部門-地點(部門可能無地點)
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;
外連接是「保留主表、補充從表」的語義工具。掌握三種類型與標準語法,寫出正確、可維護的多表查詢。