Oracle 支援:等值連接 (Inner Join)、外部連接 (Outer Join)、不等值連接、自我連接。本文聚焦前兩類核心用法。
-- EMP: EMPNO, ENAME, DEPTNO, SAL, MGR
-- DEPT: DEPTNO, DNAME, LOC
透過雙方具有相同意義的欄位 (如 DEPTNO) 建立連接條件,僅回傳雙方皆匹配的列。
-- 隱式笛卡兒積再過濾 (不推薦)
SELECT * FROM emp, dept;
-- 等值連接
SELECT * FROM emp, dept
WHERE emp.deptno = dept.deptno;
-- 額外條件:薪資 > 2000
SELECT e.ename, e.sal, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.sal > 2000;
SELECT e.ename, e.sal, d.dname
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE e.sal > 2000;
除了顯示匹配列,**保留單方 (或雙方) 無匹配的列**,無匹配處以 NULL 填補。
| 類型 | 語法 | 保留方 | ANSI 對應 |
|---|---|---|---|
| 左外部連接 | WHERE e.deptno = d.deptno(+) | 右表 (DEPT) 無匹配也顯示 | LEFT OUTER JOIN |
| 右外部連接 | WHERE e.deptno(+) = d.deptno | 左表 (EMP) 無匹配也顯示 | RIGHT OUTER JOIN |
| 完整外部連接 | 不支援單一 (+) 語法 需 UNION 模擬 | 雙方皆保留 | FULL OUTER JOIN |
關鍵規則:(+) 標記在 **「可為 NULL 的那一方」** 欄位上。
-- LEFT OUTER JOIN:保留 EMP 全部
SELECT e.ename, d.dname
FROM emp e
LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
-- RIGHT OUTER JOIN:保留 DEPT 全部
SELECT e.ename, d.dname
FROM emp e
RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;
-- FULL OUTER JOIN:保留雙方全部 (8i 無法單一語法完成)
SELECT e.ename, d.dname
FROM emp e
FULL OUTER JOIN dept d ON e.deptno = d.deptno;
| 連接類型 | 回傳列數 | 說明 |
|---|---|---|
| INNER JOIN | 3 | 10,20,30 皆有匹配 |
| LEFT JOIN | 3 (EMP) + 0 (DEPT 無匹配) | EMP 全部;DEPT 40 無匹配不影響 |
| RIGHT JOIN | 3 (匹配) + 1 (DEPT 40) | DEPT 全部;EMP 無 40 部門員工 → ENAME=NULL |
| FULL JOIN | 4 | EMP 3 列 + DEPT 40 (ENAME=NULL) |
WHERE d.dname = 'SALES'),會隱性轉為 INNER JOIN。解法:將條件移至 ON 子句 ON e.deptno = d.deptno AND d.dname = 'SALES'。