查詢每位員工的姓名、薪資、部門名稱、薪資等級,以及其主管的姓名、主管薪資、主管薪資等級。使用 Oracle 內建 Scott 架構下的 EMP、DEPT、SALGRADE 三張表。
| 表名 | 關鍵欄位 | 說明 |
|---|---|---|
| EMP | EMPNO, ENAME, SAL, DEPTNO, MGR | MGR 為主管員工編號 (自參考 FK) |
| DEPT | DEPTNO, DNAME | 部門主檔 |
| SALGRADE | GRADE, LOSAL, HISAL | 薪資等級區間對照表 |
SELECT * FROM salgrade;

SELECT DISTINCT e.ename, e.sal, d.dname, g.grade AS e_grade
FROM emp e, dept d, salgrade g
WHERE e.deptno = d.deptno
AND e.sal BETWEEN g.losal AND g.hisal;

SELECT e.ename, e.sal, d.dname, g.grade, s.ename AS mgr_name
FROM emp e, dept d, salgrade g, emp s
WHERE e.deptno = d.deptno
AND e.sal BETWEEN g.losal AND g.hisal
AND s.empno = e.mgr;

SELECT e.ename, e.sal, d.dname, g.grade AS e_grade,
s.ename AS mgr_name, s.sal AS mgr_sal, g2.grade AS m_grade
FROM emp e, dept d, salgrade g, emp s, salgrade g2
WHERE e.deptno = d.deptno
AND e.sal BETWEEN g.losal AND g.hisal
AND s.empno = e.mgr
AND s.sal BETWEEN g2.losal AND g2.hisal;

SELECT e.ename, e.sal, d.dname,
DECODE(g.grade, 5, '第一等薪資', 4, '第二等薪資', 3, '第三等薪資', 2, '第四等薪資', 1, '第五等薪資') AS e_grade,
s.ename AS mgr_name, s.sal AS mgr_sal,
DECODE(g2.grade, 5, '第一等薪資', 4, '第二等薪資', 3, '第三等薪資', 2, '第四等薪資', 1, '第五等薪資') AS m_grade
FROM emp e, dept d, salgrade g, emp s, salgrade g2
WHERE e.deptno = d.deptno
AND e.sal BETWEEN g.losal AND g.hisal
AND s.empno = e.mgr
AND s.sal BETWEEN g2.losal AND g2.hisal;

EMP 表出現兩次別名 e (員工) 與 s (主管),透過 e.mgr = s.empno 關聯。LOSAL ~ HISAL 區間,使用 BETWEEN ... AND ...。SELECT e.ename, e.sal, d.dname, g.grade AS e_grade,
s.ename AS mgr_name, s.sal AS mgr_sal, g2.grade AS m_grade
FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade g ON e.sal BETWEEN g.losal AND g.hisal
LEFT JOIN emp s ON e.mgr = s.empno -- KING 無主管,用 LEFT JOIN 保留
LEFT JOIN salgrade g2 ON s.sal BETWEEN g2.losal AND g2.hisal;
SALGRADE 需 JOIN 兩次 (員工、主管各一次)。INNER JOIN 導致無主管員工 (如 KING) 被過濾掉,應改 LEFT JOIN。BETWEEN 邊界包含,確認 SALGRADE 區間無重疊缺口。