오라클에서 paging을 처리하기 위해서는 오라클에서 제공되는 rownum을 사용하게 됩니다.

하지만 rownum을 잘못알고 사용을 하게 되면 저처럼 삽질을 계속 하게 된다는 ^^;;

예를들면...

  SELECT *
  FROM (
            select board_seq, board_name, insert_date
            from t_board
            order by insert_date desc
            )
   WHERE ROWNUM >= 1 AND ROWNUM <= 10

  이렇게 쿼리문을 날리면 데이터가 나옵니다.

  하지만 ..

  SELECT *
  FROM (
            select board_seq, board_name, insert_date
            from t_board
            order by insert_date desc
            )
   WHERE ROWNUM >= 11 AND ROWNUM <= 20

   이렇게 쿼리문을 날렸을때 그냥 보기에는 나올것 같습니다. 하지만 아무런 데이터가
   나오지를 않습니다.^^; 아주 황당합니다.

그래서 많이쓰는 방법으로... 첫번째..

  SELECT *
  FROM (
            select rownum as rnum, board_seq, board_name, insert_date
            from t_board
            order by insert_date desc
            )
   WHERE rnum>= 11 AND rnum <= 20

  서브쿼리에서 rownum을 구해 동일한 방법으로 where 조건을 주면 아주 잘 나옵니다.

또다른 방법.. 두번째..

  row_number() over(정렬을 위한 order by) 를 사용하면 됩니다.

  SELECT *
  FROM (
            select row_number() over(order by insert_date desc) as rnum, board_seq,
                     board_name, insert_date
            from t_board
            )
   WHERE rnum>= 11 AND rnum <= 20

첫번째 방법과 두번째 방법을 했을경우 결과는 동일합니다.

차이점이 있다면 두번째 방법에서 row_nuber() over()를 이용해서 over()안에 있는
order by 순으로 rownum을 새롭게 구하는것입니다.

* 참고 : row_number()는 오라클 8.1.6.0.0 이상에서 사용이 가능합니다.
신고

티스토리 툴바