系統整理 Oracle 多表連接的四大類型:內連接、左/右/全外連接、交叉連接,提供標準 ANSI 語法、Oracle 舊式語法、結果集語義、適用場景與效能提示。
| 類型 | ANSI 標準語法 | Oracle 舊式語法 | 結果集特徵 |
|---|---|---|---|
| 內連接 | INNER JOIN ... ON | WHERE a.id = b.id | 僅保留雙邊匹配的列 |
| 左外連接 | LEFT JOIN ... ON | WHERE a.id = b.id(+) | 保留左表所有列,右表無匹配為 NULL |
| 右外連接 | RIGHT JOIN ... ON | WHERE a.id(+) = b.id | 保留右表所有列,左表無匹配為 NULL |
| 全外連接 | FULL JOIN ... ON | 不支援(需 UNION 模擬) | 保留雙表所有列,無匹配皆為 NULL |
| 交叉連接 | CROSS JOIN | FROM a, b 無 WHERE | 笛卡爾積,列數 = 左列數 × 右列數 |
-- 1. 內連接
SELECT * FROM mt_pb_org o
INNER JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
-- 2. 左外連接
SELECT * FROM mt_pb_org o
LEFT JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
-- 等價舊式
SELECT * FROM mt_pb_org o, mt_pb_orgframe f
WHERE o.pb_orgframeid = f.pb_orgframeid(+);
-- 3. 右外連接
SELECT * FROM mt_pb_org o
RIGHT JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
-- 等價舊式
SELECT * FROM mt_pb_org o, mt_pb_orgframe f
WHERE o.pb_orgframeid(+) = f.pb_orgframeid;
-- 4. 全外連接
SELECT * FROM mt_pb_org o
FULL JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
-- 5. 交叉連接
SELECT * FROM mt_pb_org o
CROSS JOIN mt_pb_orgframe f;
外連接回傳結果**不僅包含符合條件的列,還包含單邊表所有不符合條件的列**(另一邊欄位填 NULL)。這是「保留主表、補充從表」的核心語義。
LEFT JOIN b ON a.id = b.id AND b.status = 'A' 保留左表所有列;若寫在 WHERE 會隱性轉內連接CROSS JOIN 或無 WHERE 的舊式連接-- 使用 LEADING Hint 指定連接順序
SELECT /*+ LEADING(o f) USE_HASH(f) */ *
FROM mt_pb_org o
LEFT JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
連接查詢是 SQL 的核心。**掌握四大類型語義、標準語法、ON/WHERE 陷阱、優化器行為**,是寫出高效正確多表查詢的前提。