(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  

 
 

댓글 없음:
댓글 쓰기