三種外部連接語義對比
| 連接類型 | 語法 | 結果集包含 |
| 左連接 | LEFT JOIN / LEFT OUTER JOIN | 左表所有行 + 右表匹配行(無匹配則 NULL) |
| 右連接 | RIGHT JOIN / RIGHT OUTER JOIN | 右表所有行 + 左表匹配行(無匹配則 NULL) |
| 全連接 | FULL JOIN / FULL OUTER JOIN | 雙表所有行,無匹配處填 NULL |
ANSI SQL-99 標準語法(推薦)
左連接範例
SELECT
NVL(left_.dummy, '這是要右邊的全部') AS left_dummy,
NVL(right_.dummy, '這是要左邊的全部') AS right_dummy
FROM dual left_
LEFT JOIN dual right_
ON left_.dummy || 'd' = right_.dummy;
右連接範例
SELECT
NVL(left_.dummy, '這是要右邊的全部') AS left_dummy,
NVL(right_.dummy, '這是要左邊的全部') AS right_dummy
FROM dual left_
RIGHT JOIN dual right_
ON left_.dummy || 'd' = right_.dummy;
Oracle 專有舊語法(+(號))
僅支援左/右連接,不支援 FULL JOIN:
左連接(右表欄位加 +)
SELECT
NVL(left_.dummy, '這是要右邊的全部') AS left_dummy,
NVL(right_.dummy, '這是要左邊的全部') AS right_dummy
FROM dual left_, dual right_
WHERE left_.dummy || 'd' = right_.dummy(+);
右連接(左表欄位加 +)
SELECT
NVL(left_.dummy, '這是要右邊的全部') AS left_dummy,
NVL(right_.dummy, '這是要左邊的全部') AS right_dummy
FROM dual left_, dual right_
WHERE left_.dummy(+) || 'd' = right_.dummy;
實戰場景對比
| 場景 | 推薦寫法 | 理由 |
| 主表查詢附屬資訊 | LEFT JOIN | 主表為駕駛表,語義清晰 |
| 從表反查主表 | RIGHT JOIN 或 LEFT JOIN 交換順序 | 統一用 LEFT JOIN 降低認知負擔 |
| 雙向完整對照 | FULL JOIN | ANSI 標準唯一支援全外部連接 |
| 舊系統維護 | (+) 語法 | 相容性考量,新代碼禁用 |
效能與優化提示
- 駕駛表選擇:小結果集驅動大表,配合索引 NESTED LOOPS
- WHERE vs ON:外部連接中,ON 條件決定關聯,WHERE 條件過濾結果(可能將外部連接轉為內部連接)
- NVL/COALESCE:處理 NULL 值顯示預設值
常見錯誤
-- 錯誤:WHERE 條件過濾了外部表的 NULL 行,變相變成內連接
SELECT * FROM a LEFT JOIN b ON a.id = b.id WHERE b.status = 'active';
-- 正確:將外部表條件移至 ON 子句
SELECT * FROM a LEFT JOIN b ON a.id = b.id AND b.status = 'active';