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이 출력되게 하면 페이징을 구현 할 수 있다.
그 과정은 나중에 이어서 설명하겠다
'DB > ORACLE' 카테고리의 다른 글
[오라클]CASCADE 제약조건 추가하기 (0) | 2021.09.06 |
---|---|
오라클 시퀸스란? (0) | 2021.08.02 |
오라클 계정만들기,sid 확인 (0) | 2021.07.26 |
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor 오류해결 (0) | 2021.07.12 |