connect by nocycle prior 관련 질문 0 8 3,008

by 김성수 [2013.04.11 14:44:31]


with a as
(
    select 'A' lotid, 'B' node from dual
    union all
    select 'B' lotid, 'C' node from dual
    union all
    select 'D' lotid, 'E' node from dual
    union all
    select 'F' lotid, 'G' node from dual
    union all
    select 'F' lotid, 'H' node from dual

)
select *
from a
start with lotid ='A'
connect by nocycle prior node = lotid


* 기초데이터

PARENT CHILD
A B
B C
D E
F G
F H

* 결과
A검색 결과
lotid node
A B
B C
C -

D 검색 결과
lotid node
D E
E -

F 검색결과
lotid node
F G
G -
F H
H -

위와같은 결과를 내고 싶습니다.
많은 아이디어 부탁드립니다.

by 아린 [2013.04.11 15:00:07]
SELECT DECODE(lv, 2, node, lotid) lotid_t
     , DECODE(lv, 2, '-', node) node_t
  FROM (SELECT lotid, node, CONNECT_BY_ISLEAF leaf
          FROM a
         START WITH lotid = 'F'
         CONNECT BY PRIOR node = lotid
        ) a
     , (SELECT 1 leaf, LEVEL lv FROM dual CONNECT BY LEVEL <= 2
        ) d   
 WHERE a.leaf = d.leaf(+)        
 ORDER BY lotid, node, lv

by 김성수 [2013.04.11 17:15:24]
감사합니다 아린님 ^^

by 마농 [2013.04.11 15:12:24]
결과가 여러가지를 생각케 하네요..
만약 'X', 'F' 라는 레코드가 추가로 존재하고
'X'로 부터 시작한다고 가정했을 때 나오는 결과는 어떤 형태인가요?

by 김성수 [2013.04.11 17:13:51]

X F
F G
G -
F H
H -
이 결과입니다.


by 아린 [2013.04.11 17:22:53]
SELECT DECODE(lv, 2, node, lotid) lotid_t
     , DECODE(lv, 2, '-', node) node_t
  FROM (SELECT ROWNUM rn, lotid, node, CONNECT_BY_ISLEAF leaf
          FROM a
         START WITH lotid = 'B'
         CONNECT BY PRIOR node = lotid
        ) a
     , (SELECT 1 leaf, LEVEL lv FROM dual CONNECT BY LEVEL <= 2
        ) d   
 WHERE a.leaf = d.leaf(+)        
 ORDER BY rn, lotid, node, lv


네 그렇네요. ROWNUM 으로 수정했어요.

by 마농 [2013.04.11 17:53:17]
계층전개의 정렬순서를 유지하려면
Level rn 부분을 Rownum rn 으로 바꾸시는게 맞습니다.

by 김성수 [2013.04.12 15:45:58]
아린님 답변 정말 감사 드립니다.
추가 질문입니다.
F 로 검색 했을때 그룹값이 구별되게 나오는 방법이 잇을까요?
그룹값 lot node
1 F G
1 G -
2 F H
2 H -

by 아린 [2013.04.12 17:40:25]
그룹값은 아래 부분추가하면 되는데요. 
참고로, 아래와 같은 형태로 나타납니다.

-- 'X' 로 조회시
X F 
1 F G
1 G -
1 F H
1 H -
-- 'F' 로 조회시
1 F G
1 G -
2 F H
2 H -

 -- 'F' 조회값 설정.
SELECT ....
              SUM(DECODE(lotid, 'F', 1, 0)) OVER(ORDER BY RN) 그룹값
    FROM...
...
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입