如題:
查詢出每一個雇員的姓名,工資,部門名稱,工資在公司的等級及其領導的姓名,領導的工資,以及領導所相應的等級
這是oracle的默認Scott用戶以下的emp。dept 和 salgrade 表間的一道思考題。
雇員表(emp)
記錄了每一個雇員的基本信息
NO 字段 類型 描寫敘述
1 empno Number(4) 雇員編號
2 ename Varchar2(10) 雇員姓名
3 job Varchar2(9) 工作職位
4 mgr Number(4) 雇員的領導(經理)編號
5 hierdate date 入職日期
6 sal Number(7,2) 月薪/工資
7 comm Number(7,2) 獎金
8 deptno Number(2) 雇員所屬部門的編號
部門表(emp)
記錄了每一個部門的基本信息
NO 字段 類型 描寫敘述
1 deptno Number(2) 部門編號(唯一)
2 dname Varchar2(14) 部門名稱
3 loc Varchar2(13) 地址
工資等級表 (salgrade)
一個公司的工資等級制,用來表示同一等級的工資下限及上限
NO 字段 類型 描寫敘述
1 Grade number 等級名稱
2 Losal number 此等級的最低工資
3 hisal number 此等級的最高工資
分析:先明白工資等級表(salgrade)中的內容
select * from salgrade;

再查詢查詢出每一個雇員的姓名,工資,部門名稱,工資在公司的等級(salgrade)
SELECT distinct e.ename,e.sal,d.dname,g.grade e_grade FROM emp e,dept d,salgrade g,emp s 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 FROM emp e,dept d,salgrade g,emp s WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN losal AND hisal) AND (s.empno=e.mgr);

最后確定雇員的經理姓名,經理的工資,以及經理工資所相應的等級
SELECT e.ename,e.sal,d.dname,g.grade e_grade,s.ename mgr_name,g2.grade 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);

從這個樣例能夠看出,對於復雜的多表查詢,要一步一步地實現。不要急於求成。
進一步思考:
假設要將上面求得的結果按如樣式顯示工資的等級,應該怎樣實現
1: 第五等工資
2: 第四等工資
3: 第三等工資
4: 第二等工資
5: 第一等工資
此時僅僅能用DECODE()函數來實現
SELECT e.ename, e.sal, d.dname, decode(g.grade,5,'第一等工資',4,'第二等工資',3,'第三等工資',2,'第四等工資',1,'第五等工資') e_grade, s.ename mgr_name, s.sal mgr_sal, decode(g2.grade,5,'第一等工資',4,'第二等工資',3,'第三等工資',2,'第四等工資',1,'第五等工資') 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)
