DB/ORACLE

페이징- 서브쿼리,ROW-NUMBER()를 이용한 쿼리작성

간펴니 2021. 7. 29. 10:50
728x90

SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE
FROM (
SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE,
ROW_NUMBER() OVER(ORDER BY BNO DESC) AS
RNUM
FROM MP_BOARD
)
WHERE RNUM BETWEEN #{rowStart} AND #{rowEnd}
<!-- 1페이지 1and 10 ,2페이지 11and 20,... -->
ORDER BY BNO DESC

 

서브쿼리를 이용해서 페이징을 하는 부분의 쿼리이다.

BNO(기본키) , 제목 , 내용 , 작성자 , 작성일 을 검색해오는 쿼리

SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE
FROM 

에서 다음부분의

 (
SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE,
ROW_NUMBER() OVER(ORDER BY BNO DESC) AS
RNUM
FROM MP_BOARD
)

서브쿼리를 통해 정렬을 한다.

그냥 서브쿼리를 사용하지 않고 바로 order by bno로 정렬하면 되지않나? 하는 의문이 들었지만 생각해보니

 

1 ,2 ,3 ,4 ,5~~100까지의 bno를 가진 100개의 게시글이 있을때 ,만약 중간중간 홀수bno를 삭제했다면 게시글이 제대로 나오지 않을 것 이다. bno의 정렬을 기준으로 1페이지가 bno 1~10까지라고 했을때 원래 10개의 개시글이 나와야 하지만 2,4,6,8,10번 - 5개의 게시글 밖에 나오지 않는 것이다.

 

그래서 서브쿼리의 

ROW_NUMBER() OVER(ORDER BY BNO DESC) AS RNUM FROM MP_BOARD

을 사용했다.

 

row_number()는 over(데이터)  안의 데이터에 순차적으로 값을 준다 (1,2,3,4,5 ~) 이 값을 RNUM에 담는다.

 

과정을 설명해보면

bno의 내림차순 정렬을 한 후 거기에 1 2 3 4 숫자를 먹여준다, bno의 홀수번호를 삭제해도

bno2 = 1번 , bno4 = 2번 , bno6=3번 이런식으로 중간의 bno가 삭제되거나 수정되어도 올바른 순서를 먹여준다 

 

WHERE RNUM BETWEEN #{rowStart} AND #{rowEnd}

 

이렇게 쿼리문을 작성한 후 화면에서 1페이지를 누르면 RNUM의 1{rowStart}~10{rowEnd}이 , 2페이지를 누르면 11~20이 출력되게 하면 페이징을 구현 할 수 있다.

 

그 과정은 나중에 이어서 설명하겠다

 

 

728x90