多表聯結是關聯式資料庫核心操作。本文系統整理 Oracle 聯結語法 (舊式 + 新式 ANSI)、四大聯結類型、聯結條件撰寫技巧、效能優化原則、執行計畫分析工具 (AUTOTRACE/PLAN_TABLE),助您寫出高效、可維護的多表查詢。
-- 內聯結
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;
-- 外聯結 (+ 號在缺少資料的一方)
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+); -- 顯示無部門員工
-- 內聯結
SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
-- 左外聯結
SELECT e.last_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id;
-- 右外聯結
SELECT e.last_name, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;
-- 全外聯結
SELECT e.last_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;
-- 交叉聯結 (笛卡兒積)
SELECT * FROM employees CROSS JOIN departments;
| 類型 | 關鍵字 | 結果集 | 適用場景 |
|---|---|---|---|
| 內聯結 | INNER JOIN / JOIN | 雙方皆符合條件的列 | 主流業務查詢 |
| 左外聯結 | LEFT [OUTER] JOIN | 左表全保留 + 右表匹配 | 主表全保、從表可選 |
| 右外聯結 | RIGHT [OUTER] JOIN | 右表全保留 + 左表匹配 | 較少用,可改 LEFT |
| 全外聯結 | FULL [OUTER] JOIN | 雙方全保留 | 對帳、差異比對 |
| 自聯結 | 表別名自我 JOIN | 同一表不同角色 | 階層結構、找重複 |
= (最常用,可用 Hash Join/Merge Join)。BETWEEN ... AND、>、<、!= (通常用 Nested Loops)。ON e.emp_id = m.emp_id AND e.dept_id = m.dept_id。
DELETE FROM t1
WHERE rowid > (
SELECT MIN(rowid) FROM t1 t2
WHERE t1.email = t2.email
GROUP BY email
HAVING COUNT(*) > 1
);
SELECT a.handphoneno,
NVL(c.name, 'NULL') AS operator_name,
a.totalscore
FROM topscore a
LEFT JOIN chargeoperator cc ON SUBSTR(a.handphoneno,1,7) = cc.hpnohead
LEFT JOIN chargeoperatorinfo c ON cc.chargetype = c.chargetype
ORDER BY a.totalscore DESC;
-- 1. 建立 PLAN_TABLE (SYS 執行)
@$ORACLE_HOME/rdbms/admin/utlxplan.sql
-- 2. 授權 PLUSTRACE 角色 (SYS)
@$ORACLE_HOME/sqlplus/admin/plustrce.sql
GRANT plustrace TO username;
-- 3. 一般用戶開啟 AUTOTRACE
SET AUTOTRACE TRACEONLY EXPLAIN STATISTICS
-- 執行查詢
SELECT ... FROM ... JOIN ... WHERE ...;
-- 關閉
SET AUTOTRACE OFF
(+) 外聯結不支援多表鏈式外聯結,務必改用 ANSI LEFT JOIN。IN 子查詢在大資料量下效能差,改用 EXISTS 或聯結。DBMS_STATS.GATHER_SCHEMA_STATS。掌握 ANSI 聯結語法、優化原則與執行計畫分析,是寫出高效能多表查詢的必經之路。