계층쿼리 트리제거후 여러컬럼표현 0 6 1,222

by sw5716 [SQL Query] 계층 트리 레벨 [2018.08.17 09:06:27]


안녕하세요 도움을 얻고자 합니다

계층쿼리중 레벨단위로 한로우에 컬럼형식으로 표현하고 싶은데 표현이 어렵습니다

레벨1

    레벨2

        레벨3

이런식이 아닌

레벨1           레벨2            레벨3

이렇게 한컬럼 한컬럼식 표현하고 싶습니다 

부탁드립니다

감사합니다

by 우리집아찌 [2018.08.17 09:14:32]

WITH T AS (
SELECT '1' ID , '0' UP_ID FROM DUAL UNION ALL
SELECT '2' ID , '1' UP_ID FROM DUAL UNION ALL
SELECT '3' ID , '2' UP_ID FROM DUAL UNION ALL
SELECT 'A' ID , '0' UP_ID FROM DUAL UNION ALL
SELECT 'B' ID , 'A' UP_ID FROM DUAL UNION ALL
SELECT 'C' ID , 'B' UP_ID FROM DUAL 
)
SELECT MAX(CASE WHEN LV = 1 THEN ID END) AS LV1
     , MAX(CASE WHEN LV = 2 THEN ID END) AS LV2 
     , MAX(CASE WHEN LV = 3 THEN ID END) AS LV3 
  FROM ( SELECT T.* , LEVEL LV , CONNECT_BY_ROOT(ID) GRP
           FROM T 
          START WITH UP_ID = '0'
        CONNECT BY PRIOR ID = UP_ID
       )
 GROUP BY GRP

 


by 우리집아찌 [2018.08.17 09:17:20]
-- PIVOT 이용
WITH T AS (
SELECT '1' ID , '0' UP_ID FROM DUAL UNION ALL
SELECT '2' ID , '1' UP_ID FROM DUAL UNION ALL
SELECT '3' ID , '2' UP_ID FROM DUAL UNION ALL
SELECT 'A' ID , '0' UP_ID FROM DUAL UNION ALL
SELECT 'B' ID , 'A' UP_ID FROM DUAL UNION ALL
SELECT 'C' ID , 'B' UP_ID FROM DUAL 
)
SELECT *
  FROM ( SELECT T.ID , LEVEL LV , CONNECT_BY_ROOT(ID) GRP
           FROM T 
          START WITH UP_ID = '0'
        CONNECT BY PRIOR ID = UP_ID
       ) PIVOT ( MIN(ID) FOR LV IN ( 1 LV1 , 2 LV2, 3 LV3) ) 

 


by 마농 [2018.08.17 09:23:16]

질문하실 때 "레벨1", "레벨2", "이런식" 등의 표현만으로는 부족합니다.
실제 자료가 자식이 하나뿐인지? 여렇일 수 있는지?
출력 결과에 모든 노드가 나와야 하는지? 최하위 노드만 나와야 하는지?
레벨은 3레벨까지 고정인지? 2레벨이나 4레벨에 끝날 수도 있는지? 그 이상도 가능한지?
"이런식"의 표현만으로는 불분명 합니다.
실제 예시 자료를 가지고 원본 대비 결과표로 질문해 주셔야 합니다.


by sw5716 [2018.08.17 10:07:01]

넵 감사합니다

여러 자식이 있지만 최종적으로 레벨3까지만 표현해주면 됩니다

레벨1 - 레벨2 - 레벨3 - 레벨4

레벨1 - 레벨2

레벨1 - 레벨2 - 레벨3 

 

자식이 최종값이 레벨2라면 마지막자식까지 뿌려주면 됩니다


by 마농 [2018.08.17 10:12:31]

결국 또 모호한 표현으로 질문하시네요.
레벨3 까지만 표현한다고 하고, 그 아래엔 레벨4 가 출력되고 있네요?
레벨3 까지만 표현하는 것인지?
레벨을 특정짓지 않고 최하위 노드를 출력하는 것인지?
모호한 표현보다는 예시자료를 가지고 질문하시는게 좋습니다.
예시자료를 만들면서 스스로 질문이 정리되는 효과도 있습니다.


by 마농 [2018.08.17 10:18:45]
SELECT REGEXP_SUBSTR(p, '[^,]+', 1, 1) lv1
     , REGEXP_SUBSTR(p, '[^,]+', 1, 2) lv2
     , REGEXP_SUBSTR(p, '[^,]+', 1, 3) lv3
     , REGEXP_SUBSTR(p, '[^,]+', 1, 4) lv4
  FROM (SELECT SYS_CONNECT_BY_PATH(empno, ',') p
          FROM emp
       --WHERE CONNECT_BY_ISLEAF = 1    -- 최하위 노드만 출력
         START WITH mgr IS NULL
         CONNECT BY PRIOR empno = mgr
       --    AND LEVEL <= 3             -- 3 레벨 까지만 출력
        )
;

 

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