2014년 1월 2일 목요일

(SQL교육, SQL순위매기기)Emp Table에서 Salary가 많은 순서로 1위부터 5위까지 Fetch

(SQL교육, SQL순위매기기)Emp Table에서 Salary가 많은 순서로 1위부터 5위까지 Fetch
 
SQL> select ename, sal from emp a
      where 5 > (select count(*) 
           from emp b
          where b.sal > a.sal)
    order by sal desc;
 
물론 아래와 같은 경우도 된다.
 
select ename, sal
from emp a
where (select count(*)
      from emp b
      where b.sal > a.sal) < 5
order by sal desc
 
다음 예문처럼 row_number() 함수를 사용해도 된다.
 
SELECT ename        ,sal
FROM (    
        SELECT ename  ,sal  ,
              row_number () over (ORDER BY sal DESC) rn
        FROM emp )
WHERE rn <= 5
 
 
또다른 방법 order by를 사용하지 않고 인덱스와 힌트를 이용해서!
내 생각엔 가장 좋을 것 같다.
 
create index idx_emp_sal on emp(sal)
 
// 게시판에 힌트 구문이  주석처리되는 관계로  /* 사이에 - 하나 넣었습니다.

SELECT ename        ,sal
FROM (
        SELECT /-*+ index_desc(emp idx_emp_sal) */ ename  ,sal  ,
              rownum rn
        FROM emp
        WHERE sal > 0)
WHERE rn <= 5 

댓글 없음:

댓글 쓰기