안녕하세요
궁금한 부분이 있어 이렇게 글 올립니다.
인덱스용 테이블(트리형태) 의 IDX번호가 있고요
글보기 테이블의 NO번호가 있을때
데이터가
IDX NO
1 1
1 2
5 1
5 2
5 3
7 1
7 2
이런식의 데이터가 있을때
제가 IDX 1 에 NO 2 를 선택했다면
다음이라는 화살표를 눌렀을때 IDX 5 의 NO 1 을...
이전이라는 화살표를 눌렀을때는 IDX 1 의 NO 1 을 찾을 수 있는 쿼리방법이나 함수가 있을까요??
많은 선배 고수님들의 답변 부탁드립니다.
데이터가 소량이라면 풀스캔후 LAG, LEAD 등을 이용해 전후 idx, no 를 가져올 수는 있습니다.
대량의 경우엔 인덱스를 이용하는게 성능상 좋긴 하겠지만...
항목이 두개이다 보니 조건 주기가 여간 까다로운게 아닙니다.
CREATE TABLE test3 AS SELECT 1 idx, 1 no FROM dual UNION ALL SELECT 1, 2 FROM dual UNION ALL SELECT 5, 1 FROM dual UNION ALL SELECT 5, 2 FROM dual UNION ALL SELECT 5, 3 FROM dual UNION ALL SELECT 7, 1 FROM dual UNION ALL SELECT 7, 2 FROM dual ; CREATE UNIQUE INDEX x01_test3 ON test3(idx, no); SELECT /*+ INDEX_DESC(test3 x01_test3) USE_CONCAT */ 'PRE' gb, idx, no FROM test3 WHERE ( (idx = :v_idx AND no < :v_no) OR idx < :v_idx ) AND ROWNUM <= 1 UNION ALL SELECT /*+ INDEX_ASC(test3 x01_test3) USE_CONCAT */ 'NEXT' gb, idx, no FROM test3 WHERE ( (idx = :v_idx AND no > :v_no) OR idx > :v_idx ) AND ROWNUM <= 1 ;
LAG, LEAD를 쓰면 간편하겠다 생각했는데 마농님 말씀처럼 데이터 양이 많아지니...ㅠㅠ
마농님이 주신 것도 실행해 보았는데요 NEXT는 다음번 번호를 가져오는데 이전것은 항상 처음만 가져와요 ㅠㅠ
WITH test3 AS
(SELECT 1 idx, 1 no FROM dual
UNION ALL SELECT 1, 2 FROM dual
UNION ALL SELECT 5, 1 FROM dual
UNION ALL SELECT 5, 2 FROM dual
UNION ALL SELECT 5, 3 FROM dual
UNION ALL SELECT 7, 1 FROM dual
UNION ALL SELECT 7, 2 FROM dual
)
SELECT /*+ INDEX_DESC(test3 x01_test3) USE_CONCAT */
'PRE' gb, idx, no
FROM test3
WHERE ( (idx = :v_idx AND no < :v_no) OR idx < :v_idx )
AND ROWNUM <= 1
UNION ALL
SELECT /*+ INDEX_ASC(test3 x01_test3) USE_CONCAT */
'NEXT' gb, idx, no
FROM test3
WHERE ( (idx = :v_idx AND no > :v_no) OR idx > :v_idx )
AND ROWNUM <= 1