JNB
rss

skin by 이글루스

오라클

오라클 top 구현 10.03.30 17:26

아래는 공부하면서 정리한 글을 올리는 것이라 존댓말을 쓰지 않았습니다.

 

 

요구사항 : 입사일이 빠른 순으로 직원 10명의 정보를 불러오려고 함

 

1. MS-SQL

 

SELECT TOP 10 *
FROM    EMP
ORDER BY HIREDATE;
 
2. Oracle
(TOP 명령어 없음)

 

DB 입문자는 아래와 같은 쿼리를 생각해내는 경우가 많다.

 

SELECT *
FROM    EMP
WHERE  ROWNUM < 11
ORDER BY HIREDATE;

 

그러나 ROWNUM은 ORDER BY 절이 실행되기 전에 적용된다.
EMP 테이블로부터 읽어온 자료는 어떤 기준에 따라 ROWNUM 번호가 매겨지고,

그 다음에 HIREDATE 순으로 정렬된다.
입사일 순으로 오름차순 정렬된 자료에 ROWNUM이 오름차순으로 적용되는 것이 아니다!

 

 

 

위 그림을 살펴보면 SMITH가 입사일이 가장 빠름에도 불구하고,

ROWNUM 값이 11이라서 WHERE ROWNUM < 11 기준을 만족하지 못하므로 결과에 포함되지 못했다.

 

정리하면

"WHERE ROWNUM < n

 ORDER BY hiredate;"

조건이 입사일이 빠른 순으로 직원 n명의 정보를 불러오는 것이 아니다!

 

어떤 기준에 의해 ROWNUM 번호가 매겨진 자료에서

ROWNUM 번호가 1 ~ (n-1)번인 직원들의 정보만 읽어온 다음에,
그 직원들을 입사일이 빠른 순으로 정렬하여 돌려줄 뿐이다.

 

 

위와 같은 요구사항을 제대로 처리하려면 보통 다음과 같이 FROM 절에 서브 쿼리를 사용한다.

 

SELECT *
FROM (SELECT *
           FROM EMP
           ORDER BY HIREDATE)
WHERE ROWNUM < 11;

 

FROM 절 서브쿼리에 ORDER BY 절을 포함시키고 최상위 레벨 쿼리에 ROWNUM 조건을 넣으면
ROWNUM이 입사일 기준 오름차순으로 정렬된 자료에 상응하게 만들 수 있다.
이런 기법을 top-N reporting이라고 하기도 한다.

 


        

    
Copyright 1999-2020 Zeroboard / skin by JY