oracle limit 구현에 관한 질문입니다. 1 2 1,625

by phil [SQL Query] [2010.05.30 21:46:21]


select idx , addr , val_data from
(
    select rownum r , t1.*
    from
    jpj_test t1
) tt
where r between 3 and 5

//===============================================
select rownum r , t1.*
from
jpj_test t1
where r between 3 and 5

첫번째 쿼리는 제대로 동작을 합니다. 헌데 , 두번째 쿼리는 에러가 발생합니다.
where절에서 에러가 발생하는데요.
오라클에서 mysql의 limit 기능을 구현할 경우에 반드시 서브쿼리를 사용해야 하는거 같습니다.

두번째 구문 같은 경우는 왜 에러가 발생하는지 잘 모르겠습니다.
고수분들의 조언을 부탁드립니다.

감사합니다.~

by 꼬랑지 [2010.05.31 08:43:57]
첫째, 오류가 나는 이유는 where절에 사용된 r이라는 칼럼명때문입니다. r 이라는 칼럼명은 select절에서 알리아스로 준 이름인데요 where절이 select 절보다 먼저 실행되기 때문에 SELECT절에서 명명한 이름을 WHERE절에서는 알 수가 없습니다.

두번째 오라클의 rownum은 옵티마이져에 의해 테이블에 엑세스되어 where조건을 만족한 로우들에 대해 SELECT된 순서대로 매겨지는 의사칼럼입니다. 따라서 WHERE절에 R이 아닌 ROWNUM이라는 칼럼명을 사용하더라도 오류는 안나지만 조회되는 칼럼은 하나도 없습니다. 나중에 수행된 SELECT절에 의해 부여된 의사칼럼을 먼저 실행된 WHERE절에서는 알 수가 없기 때문입니다.

by 마농 [2010.05.31 08:44:02]
sql 의 처리 순서를 생각하시면 됩니다.
select - 5
from - 1
where - 2
group by - 3
having - 4
order by -6
where 절이 select 절보다 먼저 수행되므로 select 절의 알리아스를 where 절에서 인식하지 못합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입