맨날 까먹어서 맨날 다시 만든다...

SELECT rownum AS rn, A.num, A.status
FROM
  (
    SELECT num, status FROM bp_test1 WHERE status != 'D' ORDER BY status ASC, num ASC
  ) A
WHERE rn >= 1 AND rn <= 10

이건 안됨. rn을 못찾는군...

SELECT rownum, A.num, A.status
FROM
  (
    SELECT num, status FROM bp_test1 WHERE status != 'D' ORDER BY status ASC, num ASC
  ) A
WHERE rownum >= 1 AND rownum <= 10

이건 되는군.

근데 웃기는건 WHERE 절을 rownum >= 2로 하면 데이타가 없다. 꼭 2가 아니라 2 이상으로 하면 안나온다.

찾아보니
rownum이 1보다 크다는 조건은 항상 거짓이 됩니다. 
select문으로 조회된 첫 번째 로우에 대해서 rownum이 1로 지정될텐데
그럼 rownum이 1보다 크다는 조건이 거짓이 되므로 제외됩니다. 
그러면 그 다음의 두번째 로우가 첫번째 로우가 되고 rownum이 1이 지정됩니다.
역시 조건이 거짓이 되므로 제외됩니다.
그런 식으로 모든 로우에 대해 조건을 만족하지 못하게 되니 조회되는게 없게 됩니다.

이렇다는군...

그럼.

select * from (
    select rownum rn, a.
    from rowtest a
    where rownum <= 10
) a where rn >= 6

이렇게 하라는데, 이건 안쪽의 쿼리에 정렬이 없을 때에나 사용가능하다.
조건 처리 후, 정렬 하기 때문에, 정렬 후에 rownum으로 갯수를 한정하고 싶으면 서브쿼리로 해야할 듯.

삼중으로 가야할 듯 해서 뒤져보니 역시나...
SELECT *
FROM
  (
    SELECT rownum rn, A.*
    FROM
      (
        SELECT num, status
        FROM bp_test1
        WHERE
          status != 'D'
        ORDER BY status ASC, num ASC
      ) A
    WHERE
      rownum <= 20 --Maximun
  )
WHERE
  rn >= 6 --Start#


'프로그래밍 > DB' 카테고리의 다른 글

[ORACLE] 특수문자 입력  (0) 2009.10.21
[Oracle] Toad 단축키  (0) 2009.08.22
[Oracle] [펌] sqlplus 사용법  (0) 2009.03.24
[펌] MSSQL 함수모음  (0) 2009.01.14
[펌] MSSQL 날짜 함수  (0) 2009.01.14