Oracle 支援 ANSI SQL:1999 標準的 LEFT JOIN、RIGHT JOIN、FULL JOIN,並保留舊式 (+) 外連接語法。本文以 DUAL 表為例,展示三種標準外連接與舊式語法的對應關係與結果差異,助開發者精準掌握資料集合邏輯。
| 連接類型 | 結果集包含 |
|---|---|
| LEFT JOIN | 左表所有列 + 右表匹配列(無匹配則 NULL) |
| RIGHT JOIN | 右表所有列 + 左表匹配列(無匹配則 NULL) |
| FULL JOIN | 左表所有列 + 右表所有列(雙向無匹配均為 NULL) |
建立兩個邏輯表別名 LEFT_、RIGHT_,連接條件 LEFT_.DUMMY || 'd' = RIGHT_.DUMMY(故意不匹配以展示 NULL 填充)。
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;
結果:左表 DUAL 單行 'X' 保留,右表無匹配 → 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;
結果:右表 DUAL 單行 'X' 保留,左表無匹配 → LEFT_DUMMY 顯示預設字串。
(+) 對應 LEFT JOINSELECT
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(+) 不能用於 OR 條件、不能對同一表多欄位加 (+)、不支援 FULL JOIN| 維度 | ANSI JOIN | 舊式 (+) |
|---|---|---|
| 可讀性 | 連接條件與過濾條件分離 | 混雜在 WHERE 子句 |
| FULL JOIN 支援 | 原生支援 | 不支援(需 UNION 兩邊 LEFT/RIGHT) |
| 多表連接 | 清晰的 ON 子句鏈 | 易產生笛卡兒積或邏輯錯誤 |
| 相容性 | 跨資料庫可移植 | Oracle 專有 |
| 建議 | 新代碼全面使用 ANSI JOIN | 僅維護舊代碼時接觸 |
NVL(col, default) 或 COALESCE(col1, col2, ...) 處理外連接產生的 NULL 顯示WHERE right.col = 'value' 會隱性轉為內連接,應移至 ON 子句LATERAL / CROSS APPLY 進階連接模式掌握 LEFT/RIGHT/FULL JOIN 的集合語義,拋棄舊式 (+) 語法,是寫出可維護、可移植 SQL 的基礎。下次寫連接查詢時,先在腦中畫出文氏圖,再落鍵盤。