ORACLE START WITH 질문 드려요 ㅜㅜ! 0 3 2,470

by 밀크캬라멜 [2015.04.03 18:48:45]


 

안녕하세요!

제가 지금 계층적으로 등록된 테이블을 조회하려고 하는데요

제가 찾고싶은건 밑에서부터..? 그러니까

PARENT                                                 CHILD

A B
B C
C D
B E
E F

 

테이블이 대충 이런 구조로 되어있거든요

그냥 앞에서부터 조회하려고 하면 

SELECT *

FROM CATEGORY

START WITH PARENT = 'A'

CONNECT BY PARENT = PRIOR CHILD

로 조회하면 나오잖아요

그런데 저는 저기서 D의 경로만 알고싶거든요..ㅜㅜ

조회하면 

A B

B C

C D

이렇게만 나오도록..ㅠㅠ 제일 최상위와 찾고싶은 최하위가 무언지만 아는데

어떻게 조회할 수 있는 방법이 없을까요???

 

혹시 몰라 역전개 후 다시 정전개를 해봤는데

A B
B C
C D
B E
E D

 

 

이 테이블에서 D를 조회한다고 하면

A B

B C

C D

A B

B E

E D

이렇게 같은 경로(AB)가 2번 중복해서 나오고 순서도 뒤죽박죽이여서..ㅠㅠㅠ

 

제가 작성해놓은게 이해가 가셨을런지 잘 모르겠네요..

짧게 말하면 START WITH CONNECT BY 사용할때

최상위와 최하위만 아는데 그 사이 경로를 뽑아낼 수 있을까입니다!!

참고로 최상위는 하나이고, 최하위는 여러 개가 올 수가 있습니다..ㅜㅜ

by mypark [2015.04.03 19:40:28]
SELECT PARENT, CHILD
FROM CATEGORY
START WITH PARENT = 'A'
CONNECT BY PARENT = PRIOR CHILD
INTERSECT
SELECT PARENT, CHILD
FROM CATEGORY
START WITH CHILD = 'D'
CONNECT BY PRIOR PARENT = CHILD
;

되나 한 번 확인해보세요 ;

그냥 Path만 보실거면

SELECT CONNECT_BY_ROOT(PARENT) || SYS_CONNECT_BY_PATH(CHILD, '-') PATH
FROM CATEGORY
WHERE CHILD = 'D'
START WITH PARENT = 'A'
CONNECT BY PARENT = PRIOR CHILD
;

 


by 밀크캬라멜 [2015.04.06 18:02:49]

헉 너무너무 감사합니다 ㅠㅠㅠㅠㅠㅠ위 쿼리 응용해서 해결했어요 ㅠㅠㅠㅠㅠㅠ 너무 감사합니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠINTERSECT이걸 쓸 줄 몰랐네용 ㅠㅠㅠ


by 마농 [2015.04.06 08:44:12]
WITH t AS
(
SELECT 'A' p, 'B' c FROM dual
UNION ALL SELECT 'B', 'C' FROM dual
UNION ALL SELECT 'C', 'D' FROM dual
UNION ALL SELECT 'B', 'E' FROM dual
UNION ALL SELECT 'E', 'F' FROM dual
)
SELECT *
  FROM t
 START WITH c = 'D'
 CONNECT BY c = PRIOR p
 ORDER BY LEVEL DESC
;

 

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