일정한 No가 아닌경우 다음번 번호로 어떻게 넘어갈 수 있을까요??? 0 6 1,790

by 갱이 [2014.12.11 13:10:10]


안녕하세요

궁금한 부분이 있어 이렇게 글 올립니다.

 인덱스용 테이블(트리형태) 의 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 을  찾을 수 있는 쿼리방법이나 함수가 있을까요??

많은 선배 고수님들의 답변 부탁드립니다.

 

by 비주류 [2014.12.11 14:33:29]

Oracle 이라면 lead, lag 쓰시면 될 것 같습니다.

lead(idx) over (order by idx, no), lead(no) over (order by idx, no)


by 마농 [2014.12.11 14:45:30]

데이터가 소량이라면 풀스캔후 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
;

 


by 갱이 [2014.12.11 14:55:33]

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


by 마농 [2014.12.11 15:00:18]

WITH 문으로 수행하면 당연히 인덱스를 안타죠.

저는 테이블 생성하고 인덱스 생성하고 그리고 테스트 한건데요.


by 갱이 [2014.12.11 15:12:09]

제가 사용하는 테이블이 마농님이 만드신 테이블과 인덱스정의가 다르게 되어있어

제대로 실행이 안되었던것같아요

WITH 문은 인덱스가 안되는군요 ㅠㅠ 이부분도 알게 되었습니다.

마농님 항상 많은 도움 주셔서 감사합니다.^^

오라클 공부 더 열심히 해야겠어요!!

제가 모르고 있는 함수가 어마어마하게 많겠죠?? ㅠㅠ

마농님 비주류님  두분 모두 답변 감사합니다.


by 비주류 [2014.12.11 17:43:55]

게시판 형태라면, 리스트 ->상세 화면 넘어갈때 앞뒤 항목 번호들을 같이 넘겨주는 방법도 있을 것 같습니다.
페이징 고려하면 -1, +1 더 가져오는 부담은 있겠네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입