계층쿼리에서 제일 하위 코드를 던지면 제일 높은 상위코드를 찾아서 그 하위의 코드를 찾을수 있을까요? 0 9 1,090

by 초봉 [SQL Query] [2017.08.22 10:16:48]


계층 쿼리를 짜던중에 제목과 같이

계층쿼리에서 제일 하위 코드를 던지면 제일 높은 상위코드를 찾아서 그 하위의 코드를 찾을수 있을까요?

예시 데이터로는

cd up_cd lev
01   1
02 01 2
03 02 3
04 02 3
05 01 2
06 05 3
07 01 2
08 07 3
09 08 4
10   1
11 10 2
12 11 3
13   1

위의 형태에 테이블에 데이터가 들어가 있고

현재 제가 파라미터로 쓰이는 값은 09 또는 06 또는 03,04 값을 하나만 던집니다.

03 이라고 던졌을때 제일 상위인 1lev 01 값을 찾아서 그 하위 tree 에 있는 마지막 cd 값을 찾을수 있을까요?

09,06,03,04 이렇게 값이 출력 될수 있을까요? 계층이다 보니 맨 아래 하위단 cd lev 값은 다를수 있더라구요. 도와주세요 ㅜㅜ

by 우리집아찌 [2017.08.22 10:26:32]
WITH T AS (
SELECT '01' CD , '' UPCD  FROM DUAL UNION ALL
SELECT '02' , '01'  FROM DUAL UNION ALL
SELECT '03' , '02'  FROM DUAL UNION ALL
SELECT '04' , '02'  FROM DUAL UNION ALL
SELECT '05' , '01'  FROM DUAL UNION ALL
SELECT '06' , '05'  FROM DUAL UNION ALL
SELECT '07' , '01'  FROM DUAL UNION ALL
SELECT '08' , '07'  FROM DUAL UNION ALL
SELECT '09' , '08'  FROM DUAL 
)

SELECT * 
  FROM  (SELECT CD , CONNECT_BY_ISLEAF AS LEAF
          FROM T
         START WITH CD = '03'
         CONNECT BY CD = PRIOR UPCD
        )
   WHERE LEAF = 1 ;

 


by 초봉 [2017.08.22 11:06:02]

제가 예시를 잘못 드려 1lev 형태의 값이 여러개가 존재합니다. ㅜㅜ

하위 값을 찾아야 하는데 실제로는 하위값 가지고 다른곳에서 처리하다 보니 하위 데이터를 찾아야 합니다. 가능할까요?


by 우리집아찌 [2017.08.22 11:16:34]
/* 하위값만 구하는식 */
WITH T AS (
SELECT '01' CD , '' UPCD  FROM DUAL UNION ALL
SELECT '02' , '01'  FROM DUAL UNION ALL
SELECT '03' , '02'  FROM DUAL UNION ALL
SELECT '04' , '02'  FROM DUAL UNION ALL
SELECT '05' , '01'  FROM DUAL UNION ALL
SELECT '06' , '05'  FROM DUAL UNION ALL
SELECT '07' , '01'  FROM DUAL UNION ALL
SELECT '08' , '07'  FROM DUAL UNION ALL
SELECT '09' , '08'  FROM DUAL UNION ALL
SELECT '10' , ''  FROM DUAL UNION ALL
SELECT '11' , '10'  FROM DUAL UNION ALL
SELECT '12' , '11'  FROM DUAL UNION ALL
SELECT '13' , ''  FROM DUAL 
)

SELECT LISTAGG(CD,',') WITHIN GROUP(ORDER BY LV ) 
  FROM  (SELECT CONNECT_BY_ISLEAF AS LEAF
             , CD 
             , UPCD 
             , LEVEL LV
          FROM T
        START WITH CD = '01'
        CONNECT BY PRIOR CD = UPCD
        ) 
  WHERE LEAF = 1    

 


by 마농 [2017.08.22 10:41:01]

주신 예시 데이터를 보면 어치피 최상위 노드는 하나 뿐이네요.
어떤 값을 입력해도 조회 결과는 항상 동일한 거 아닌가요?
조건 값을 입력할 필요 없이 그냥 최하위 노드를 찾는 문제인 것 같은데요?


by 초봉 [2017.08.22 11:05:40]

제가 예시를 잘못 들였네요 위에처럼 1lev 형태가 여러개 존재 합니다 ㅜㅜ 이런경우는 어떻게 해야하나요?


by 마농 [2017.08.22 11:16:14]
SELECT cd
  FROM t
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH cd = (SELECT cd
                    FROM t
                   WHERE CONNECT_BY_ISLEAF = 1    -- 최상위
                   START WITH cd = :v_cd
                   CONNECT BY cd = PRIOR up_cd    -- 역전개
                  )
 CONNECT BY PRIOR cd = up_cd
;

 


by 초봉 [2017.08.22 11:22:42]

감사합니다 마농님 추가적으로 질문해도 될까요??

1lev 로 올라가서 제일 하위의 cd를 찾는데는 되었는데요 만약

2lev로 올라가서 2lev에 속한 제일 하위의 cd를 찾을수 있을까요?


by 마농 [2017.08.22 11:29:06]
SELECT cd
  FROM t
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH cd = (SELECT cd
                    FROM t
                   WHERE lev = 2    -- 요기
                   START WITH cd = :v_cd
                   CONNECT BY cd = PRIOR up_cd
                  )
 CONNECT BY PRIOR cd = up_cd
;

 


by 초봉 [2017.08.22 16:13:36]

우리집아찌님 마농님 도움 주셔서 감사합니다.

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