오라클 Oracle SYS_CONNECT_BY_PATH


쿼리를 짜다 보면, 어떠한 값에 연결된 순서대로 조회를 하고 싶을 경우가 있습니다.

 

쉽게 생각하면, 게시판의 댓글의 경우에는 쓴 시간이나, 기타 Key 값을 떠나서 댓글 자신의 원래 글 바로 아래에 오도록 하는 것이 프로그램 하기가 가장 좋은 것이죠.

 

그래서 오늘은 계층 별 조회 쿼리 – 즉, 연결된 값이 있을 경우 연결된 값 순서에 따라 조회가 되도록 하는 쿼리를 알아보도록 하겠습니다.

 

 

SELECT 1 SEQ, 0 BEFOR_SEQ FROM DUAL
UNION
SELECT 2 SEQ, 1 BEFOR_SEQ FROM DUAL
UNION
SELECT 3 SEQ, 2 BEFOR_SEQ FROM DUAL
UNION
SELECT 4 SEQ, 0 BEFOR_SEQ FROM DUAL
UNION
SELECT 5 SEQ, 4 BEFOR_SEQ FROM DUAL
UNION
SELECT 6 SEQ, 5 BEFOR_SEQ FROM DUAL
UNION
SELECT 7 SEQ, 1 BEFOR_SEQ FROM DUAL
ORDER BY SEQ

 

 

 SEQ

 BEFOR_SEQ

 1

 0

 2

 1

 3

 2

 4

 0

 5

 4

 6

 5

 7

 1

  

이런 모양의 테이블이 있다고 가정하겠습니다.


SEQ 는 자신의 순서 번호이며, BEFOR_SEQ 는 자신의 앞 전 SEQ 입니다.

 

 

SELECT SEQ,
  LEVEL, 
  BEFOR_SEQ,
  substr( sys_connect_by_path(BEFOR_SEQ, '->'), 3) path
FROM (
    SELECT 1 SEQ, 0 BEFOR_SEQ FROM DUAL
    UNION
    SELECT 2 SEQ, 1 BEFOR_SEQ FROM DUAL
    UNION
    SELECT 3 SEQ, 2 BEFOR_SEQ FROM DUAL
    UNION
    SELECT 4 SEQ, 0 BEFOR_SEQ FROM DUAL
    UNION
    SELECT 5 SEQ, 4 BEFOR_SEQ FROM DUAL
    UNION
    SELECT 6 SEQ, 5 BEFOR_SEQ FROM DUAL
    UNION
    SELECT 7 SEQ, 1 BEFOR_SEQ FROM DUAL ) B
  start WITH BEFOR_SEQ = 0 -- tree형태의 시작
  connect BY PRIOR SEQ = BEFOR_SEQ -- tree시작점을 기준으로 맵핑 컬럼 비교

 

 

 SEQ

 LEVEL

 BEFOR_SEQ

 PATH

 1

 1

 0

 0

 2

 2

 1

 0->1

 3

 3

 2

 0->1->2

 7

 2

 1

 0->1

 4

 1

 0

 0

 5

 2

 4

 0->4

 6

 3

 5

 0->4->5

 

이렇게 자신의 바로 앞 SEQ를 따라서 나열되게 됩니다.


※ 특정한 정렬을 원하시면 마지막에 

ORDER SIBLINGS BY...

를 넣으시면 됩니다. 


 

Posted by 쭈니루
TAG

댓글을 달아 주세요