码迷,mamicode.com
首页 > 其他好文 > 详细

如何找出工资前三名的雇员

时间:2018-05-12 12:44:05      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:tin   如何   ott   sid   出现   nes   mil   为我   select   

提问:如何找出工资前三名的雇员。(工资可能为空,也可能出现重复)
以表emp为例子:
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

第一种方法为我的笨方法:

select *
from emp
where sal >= (select sal
from (select sal, rownum rn
from (select distinct sal from emp order by sal desc))
where rn = 3) order by sal desc;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

第二种为网上找的,自己稍加改造:

select *
from emp e1
where (select count(distinct sal) from emp e2 where e2.sal >= e1.sal) <= 3
order by sal desc;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

总结:明显第二种方法所写的代码量以及嵌套的层数,都要比第一种好。
后记:以后坚持写写心得什么之类的,学学大神们。

如何找出工资前三名的雇员

标签:tin   如何   ott   sid   出现   nes   mil   为我   select   

原文地址:https://www.cnblogs.com/ddzj01/p/9028212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!