문제) 월급 상위 3명?
select *
from emp
where rownum <= 3
order by sal desc; --> 엉터리 (select max(sal) from emp; ==> 5000)
↑ ↑
1) select rownum, e.*
from emp e;
2) select rownum, e.*
from emp e
where rownum <= 3;
3) select rownum, e.*
from emp e
order by sal desc;
4) select rownum, e.*
from emp e
where rownum <= 3
order by e.sal desc;
==> 정렬 이후가 아니라 정렬 한참 전인 WHERE 절을 통과한 순서대로 행 순서(ROWNUM)가 정해짐
select rownum as no, e.*
from emp e
order by e.sal desc;
==> rownum이 먼저 결정되고 난 뒤 정렬이 이루어집니다.
따라서 서브쿼리에서 rownum을 쓸 이유가 없습니다.
해결책) 서브쿼리내에서 order by 사용하고 메인쿼리의 WHERE 절에서 rownum 사용
select *
from (select * -- in-line view
from emp
order by sal desc)
where rownum <= 3;
'Oracle > SQL Fundamentals I' 카테고리의 다른 글
10일차 7 집합연산자 Set Operators(using the set operators) (0) | 2012.04.17 |
---|---|
9일차 문제(subquery) (0) | 2012.04.16 |
9일차 # Pseudocolumn (0) | 2012.04.16 |
9일차 # 6-16: ANY, ALL (0) | 2012.04.16 |
9일차 # 6-14: Multiple-subquery (comparison) operator (0) | 2012.04.16 |