[SQL] Oracle 게시판 이전글 다음글 쿼리문

리트리버J

·

2021. 1. 14. 00:20

728x90

우선 이전글 다음글을, 글 번호 +1, -1로 가져오면 에러가 날 수 있다.

글이 삭제됐을지도 모르고, Sequence의 오류가 발생 할 수 있기 때문이다.

 

처음에는 해당 게시글 번호를 구하여,

ROWNUM으로 불러와, -1 +1 한 값을 구하려고 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT * FROM
(
 SELECT ROWNUM AS ROWNUMBER, B.BNO 
 FROM BOARD B
) A
WHERE BNO = 
(
SELECT ROWNUMBER FROM
(
 SELECT ROWNUM AS ROWNUMBER, B.BNO 
 FROM BOARD B
) A
WHERE ROWNUMBER = 10
- 1
union
SELECT * FROM
(
 SELECT ROWNUM AS ROWNUMBER, B.BNO 
 FROM BOARD B
) A
WHERE BNO = 
(
SELECT ROWNUMBER FROM
(
 SELECT ROWNUM AS ROWNUMBER, B.BNO 
 FROM BOARD B
) A
WHERE ROWNUMBER = 10
+ 1;
cs

 

하지만,

LAG OVER

LEAD OVER 함수를 사용함으로써,

굉장히 편리하게 값을 가져 올 수 있다.

LAG(컬럼명,불러올다음숫자,DEFAULT값) OVER(ORDER BY 컬럼명)

LEAD(컬럼명,불러올다음숫자,DEFAULT값) OVER(ORDER BY 컬럼명)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT b.* FROM(
SELECT 
    BNO,
    BWRITTER,
    BPASSWORD,
    BPASSWORDENC,
    BSUBJECT,
    BCONTENT,
    BREGDATE,
    BMODDATE,
    BCOUNT,
    BSTATUS,
    LAG(BNO,1,-1) OVER(ORDER BY BNO ASC) AS PREBNO,
    LEAD(BNO,1,-1) OVER(ORDER BY BNO ASC) AS NEXTBNO 
FROM BOARD
) b
WHERE b.BNO = 1;
cs
728x90