퀴리좀 봐주세요 0 6 1,639

by stylebox [SQL Query] [2014.11.24 11:43:15]


idx  name  before_idx

22   테스트1 

23  테스트2 

24  테스트1  22

 

 

현재 테이블이 이런형식으로 현재 글에 이전글이 있을경우 이걸글 번호(before_idx)에 

저장을 하고 있습니다.

이때 22나 24로 조회를 할경우 현재번호와 이전번호를 체크해서 

연관된 값을 (22,24)을 가져올려구 쿼리를 만들었는데요

select * from test

where idx='24'

 OR  idx = (SELECT before_idx FROM test WHERE idx='24')
         OR  idx= (SELECT idx FROM test WHERE before_idx='24);

이렇게 했는데 흠 뭔가 복잡한거 같은데 이방법말고 다른방법이 뭐가 있을지 궁금하네요.

부족한 내공이니 많은 가르침 부탁드릴께요

감사합니다.

 

by 아발란체 [2014.11.24 12:35:53]

조회 질의를 변경하는 것 보다 가능하다면 테이블 구조를 변경하는 것이 좋아 보입니다.

조회 외 DML(쓰기, 수정) 발생 시 서로 같은 그룹이다라고 알 수 있는 그룹 코드를 가지게 된다면 조회 성능이 좋아지고 질의도 쉽가 작성 할 수 있을 것 같습니다.


by stylebox [2014.11.24 12:43:18]

답변감사합니다.

현재 테이블 구조를 변경할수 없고 새로운 기능을 추가하다보니 

어쩔수 없이 쿼리를 만든거라서요:)


by 아발란체 [2014.11.24 13:09:33]

그냥 쉽게 보면 다음 부분은 서브쿼리를 하나 줄일 수 있을 것 같습니다.

(변경 전 부분) OR idx= (SELECT idx FROM test WHERE before_idx='24);

(변경 후 부분) OR before_idx = '24'


by 마농 [2014.11.24 13:04:48]

by stylebox [2014.11.24 13:09:29]

테이블 구조가 게시판처럼 계층형이 아니라 최대 2개 이상은 존재하지 않거든요

현재글과 이전글만 존재하는 구조인데 계층형구조로 봐야되나요..??


by 마농 [2014.11.24 14:45:09]
-- 계층 구조로 볼 수 있습니다. => 계층이 2단계 뿐인거죠.
SELECT *
  FROM test
 START WITH idx = 24
 CONNECT BY idx = PRIOR before_idx
 UNION ALL
SELECT *
  FROM test
 WHERE LEVEL != 1
 START WITH idx = 24
 CONNECT BY PRIOR idx = before_idx
;
-- 2단계 고정이라면 굳이 계층구조 쿼리를 사용하지 않아도 됩니다.
-- 단, 어떻게 하든 테이블을 한번만 읽고 처리하기는 힘듭니다.
-- 계층 쿼리를 이용할지 안할지는 업무 특성에 맞추어 판단하시면 됩니다.

 

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