查詢出每個僱員的姓名,工資,部門名稱,工資在公司的等級及其領導的姓名,領導的工資,以及領導所對應的等級,僱員姓名
如題:
查詢出每個僱員的姓名,工資,部門名稱,工資在公司的等級及其領導的姓名,領導的工資,以及領導所對應的等級
這是oracle的預設Scott使用者下面的emp,dept 和 salgrade 表間的一道思考題。
分析:先明確工資等級表(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 sWHERE (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_gradeFROM emp e,dept d,salgrade g,emp s,salgrade g2WHERE (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_gradeFROM emp e,dept d,salgrade g,emp s,salgrade g2WHERE (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)