表連接(Join)是 SQL 查詢的核心技能,Oracle 提供豐富的連接語法支援各種業務場景。本文系統整理六大類連接方式,並附上實戰範例,幫助開發者快速掌握核心概念。
交叉連接不指定連接條件,結果為兩張表所有資料列的組合(笛卡兒積)。
SELECT * FROM T1, T2;
若 T1 有 2 筆、T2 有 3 筆,結果將產生 6 筆資料。實務上極少直接使用,通常作為理解連接基礎的教學範例。
以等號(=)為連接條件,僅回傳雙方符合條件的資料列。
SELECT T1.sectionA, T1.sectionB, T2.sectionC
FROM T1, T2
WHERE T1.sectionA = T2.sectionA;
使用大於、小於、BETWEEN 等非等號運算子,常用於區間比對(如薪資等級表)。
僅回傳雙方都符合連接條件的資料列,是最常見的連接類型。Oracle 專有語法(WHERE 子句)與 ANSI 標準語法(INNER JOIN ... ON)皆可使用。
-- ANSI 標準寫法
SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE, O.NAME, O.PARTNUM
FROM PART P INNER JOIN ORDERS O ON P.PARTNUM = O.PARTNUM;
保留單邊(或雙邊)所有資料列,不符合條件處以 NULL 填充。
LEFT OUTER JOIN 或 Oracle 舊語法 (+) 放在右表欄位)。RIGHT OUTER JOIN)。FULL OUTER JOIN)。-- Oracle 舊語法範例
SELECT e.name, e.employee_id, ep.salary, ep.marital_status
FROM employee_tbl e, employee_pay_tbl ep
WHERE e.employee_id = ep.employee_id(+);
同一張表連接自己,常用於階層結構查詢或資料一致性檢查。
SELECT F.PARTNUM, F.DESCRIPTION, S.PARTNUM, S.DESCRIPTION
FROM PART F, PART S
WHERE F.PARTNUM = S.PARTNUM
AND F.DESCRIPTION <> S.DESCRIPTION;
若查無資料代表無重複鍵值但描述不一致的異常。
| 運算子 | 行為 | 效能 |
|---|---|---|
| UNION | 合併結果並移除重複列 | 需排序去重,較慢 |
| UNION ALL | 直接合併,保留重複列 | 無排序,效能最佳 |
對應的集合概念:UNION = 並集,INTERSECT = 交集,MINUS = 差集。
JOIN ... ON),可讀性高且可攜性佳。UNION ALL 提升效能。熟練掌握各類連接語法與適用場景,是撰寫高效 SQL 的關鍵。建議開發者在實務專案中多加練習,並善用執行計畫(EXPLAIN PLAN)驗證連接策略。