2014년 2월 13일 목요일

 [SQL TIP,SQL교육,구로디지털단지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 [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=208 자바 오라클/빅데이터 아이폰/안드로이드 닷넷/WPF 표준웹/HTML5 채용/취업무료교육 초보자코스 [기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 총 5일 40시간 02-17 [기업100%환급]Spring ,MyBatis,Hibernate실무과정 총 5일 40시간 02-24 JAVA&WEB프레임워크실무과정 총 33일 99시간 02-25 Spring3.X, MyBatis, Hibernate실무과정 총 12일 36시간 03-03 Spring3.X, MyBatis, Hibernate실무과정 총 5일 35시간 02-22 [주말저녁]자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 총 18일 72시간 02-22 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 10일 70시간 03-01 JAVA&WEB프레임워크실무과정 총 14일 98시간 03-08 [기업100%환급]PL/SQL,ORACLE HINT,TUNING 총 5일 40시간 02-17 [기업100%환급]SQL기초에서 Schema Object까지 총 5일 40시간 02-24 SQL초보에서실전전문가까지 총 18일 54시간 02-18 SQL초보에서실전전문가까지 총 8일 56시간 02-22 [주말저녁]SQL기초에서 Schema Object까지 총 10일 40시간 03-01


[SQL TIP,SQL교육,구로디지털단지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 

댓글 없음:

댓글 쓰기