2013년 11월 4일 월요일

[오라클데이터베이스SQL]Emp Table에서 Salary가 많은 순서로 1위부터 5위(여러방법)

[오라클데이터베이스SQL]Emp Table에서 Salary가 많은 순서로 1위부터 5위(여러방법)

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 

[개강임박강좌, 오프라인교육장에 오시면 보다 자세히 배울 수 있습니다.]

오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(
www.onjprogramming.co.kr)

[주간]
  [11/13]SQL초보에서실전전문가까지
  [11/13]안드로이드개발자과정
  [11/18]Spring3.X, MyBatis, Hibernate실무과정
  [11/18]iPhone 하이브리드 앱 개발 실무과정

[평일야간]
  [11/08]C#,ASP.NET마스터
  [11/08]Spring3.X, MyBatis, Hibernate실무과정
  [11/12]iPhone 하이브리드 앱 개발 실무과정
  [11/14]JAVA&WEB프레임워크실무과정

[주말]
  [11/09]C#,ASP.NET마스터
  [11/09]JAVA&WEB프레임워크실무과정
  [11/09]Spring3.X, MyBatis, Hibernate실무과정
  [11/09]웹퍼블리싱 마스터
  [11/16]PL/SQL,오라클힌트,SQL튜닝,사례연구
  [11/16]ASP.NET4.0 MVC 프로그래밍



댓글 없음:

댓글 쓰기