문제) 월급 상위 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;



 


+ Recent posts