database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39457 게시물 읽기
No. 39457
트리형 구조를 가로형태로 만들고 싶습니다.
작성자
알려주세요
작성일
2012-05-17 18:06ⓒ
2012-05-17 18:30ⓜ
조회수
5,959

오랜만에 들어왔네요..

여러방법으로 테스트하고 있는데 도통 풀리지않아 이렇게 글을 올립니다.

읽어보시고 조언을 얻고자 합니다.

미리 감사드리겠습니다.

 

현재 자료구조 입니다.

idx upidx title
1   111111
2 1 222222
3 1 333333
4 1 444444
5 2 555555
6 2 666666
7 5 777777
8 5 888888
9 3 aaaaaa
10 3 bbbbbb
11 9 cccccc
12 9 dddddd
13 10 eeeeee
14 10 ffffff
15 13 gggggg
16 13 hhhhhh
17 14 iiiiii
18 14 jjjjjj

 

WITH t_table AS 

(

    SELECT 1 idx, NULL upidx, '11111' title FROM dual UNION ALL 

    SELECT 2, 1, '22222' FROM dual UNION ALL

    SELECT 3, 1, '33333' FROM dual UNION ALL

    SELECT 4, 1, '44444' FROM dual UNION ALL

    SELECT 5, 2, '55555' FROM dual UNION ALL

    SELECT 6, 2, '66666' FROM dual UNION ALL

    SELECT 7, 5, '77777' FROM dual UNION ALL

    SELECT 8, 5, '88888' FROM dual UNION ALL

    SELECT 9, 3, 'aaaaaa' FROM dual UNION ALL

    SELECT 10, 3, 'bbbbbb' FROM dual UNION ALL

    SELECT 11, 9, 'cccccc' FROM dual UNION ALL

    SELECT 12, 9, 'dddddd' FROM dual UNION ALL

    SELECT 13, 10, 'eeeeee' FROM dual UNION ALL

    SELECT 14, 10, 'ffffff' FROM dual UNION ALL

    SELECT 15, 13, 'gggggg' FROM dual UNION ALL

    SELECT 16, 13, 'hhhhhh' FROM dual UNION ALL

    SELECT 17, 14, 'iiiiii' FROM dual UNION ALL

    SELECT 18, 14, 'jjjjjj' FROM dual 

)

SELECT idx, upidx, title, level, LPAD(' ', (LEVEL-1)*3) || title  as aa

FROM  t_table

START WITH upidx IS NULL;

위 쿼리문을 날리면 일반 트리형태의 목록이 셀렉트 됩니다.

 

 

SELECT  idx, upidx

        ,DECODE(lv, 1, title, NULL) lv1

        ,DECODE(lv, 2, title, NULL) lv2

        ,DECODE(lv, 3, title, NULL) lv3

        ,DECODE(lv, 4, title, NULL) lv4

        ,DECODE(lv, 5, title, NULL) lv5

        ,lv

  FROM (SELECT idx, upidx

             , title 

             , LEVEL lv

          FROM t_table

         START WITH upidx is NULL

         CONNECT BY PRIOR idx = upidx

)

위 쿼리문을 날리면 아래처럼 결과물이 나옵니다.

 

 

idx upidx lv1 lv2 lv3 lv4 lv5 lv
1   11111         1
2 1   22222       2
5 2     55555     3
7 5       77777   4
8 5       88888   4
6 2     66666     3
3 1   33333       2
9 3     aaaaaa     3
11 9       cccccc   4
12 9       dddddd   4
10 3     bbbbbb     3
13 10       eeeeee   4
15 13         gggggg 5
16 13         hhhhhh 5
14 10       ffffff   4
17 14         iiiiii 5
18 14         jjjjjj 5
4 1   44444       2

 

 

 

제가 구현하고자 하는 결과물입니다. 우선 idx, upidx는 제외하도록 하겠습니다.

제일 밑단인 lv5 기준으로 상위로 올라갈때 빈공간을 없애고 싶습니다.

가능할지 모르겠네요...답변점 부탁드리겠습니다.

 

 

lv1 lv2 lv3 lv4 lv5
11111 22222 55555 77777  
11111 22222 55555 88888  
11111 22222 66666    
11111 33333 aaaaaa cccccc  
11111 33333 aaaaaa dddddd  
11111 33333 bbbbbb eeeeee gggggg
11111 33333 bbbbbb eeeeee hhhhhh
11111 33333 bbbbbb ffffff iiiiii
11111 33333 bbbbbb ffffff jjjjjj
11111 44444      

 

이런식의 자료가 필요한데 가능할지 모르겠네요..

 

 

 

이 글에 대한 댓글이 총 5건 있습니다.

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
     , REGEXP_SUBSTR(p, '[^,]+', 1, 5) lv5
  FROM (SELECT SYS_CONNECT_BY_PATH(title, ',') p
          FROM t_table
         WHERE CONNECT_BY_ISLEAF = 1
         START WITH upidx IS NULL
         CONNECT BY PRIOR idx = upidx
         --ORDER SIBLINGS BY idx
        )
;

마농(manon94)님이 2012-05-18 10:40에 작성한 댓글입니다.

 //마농님 답변 감사드립니다.

덕분에 잘 해결 되었습니다.

정규식 말고는 방법이 없을까요..??

감사합니다..

 

알려주세요님이 2012-05-21 09:17에 작성한 댓글입니다. Edit

정규식이 안되는 이유가 버전 때문인가요?

버전 문제라면? Connect_By_isLeaf 구문도 안되겠네요.

마농(manon94)님이 2012-05-21 10:21에 작성한 댓글입니다.

SELECT SUBSTR(p, x1 + 1, x2 - x1 - 1) lv1
     , SUBSTR(p, x2 + 1, x3 - x2 - 1) lv2
     , SUBSTR(p, x3 + 1, x4 - x3 - 1) lv3
     , SUBSTR(p, x4 + 1, x5 - x4 - 1) lv4
     , SUBSTR(p, x5 + 1, x6 - x5 - 1) lv5
  FROM (SELECT SYS_CONNECT_BY_PATH(title, ',') p
             , INSTR(SYS_CONNECT_BY_PATH(title, ',')||',', ',', 1, 1) x1
             , INSTR(SYS_CONNECT_BY_PATH(title, ',')||',', ',', 1, 2) x2
             , INSTR(SYS_CONNECT_BY_PATH(title, ',')||',', ',', 1, 3) x3
             , INSTR(SYS_CONNECT_BY_PATH(title, ',')||',', ',', 1, 4) x4
             , INSTR(SYS_CONNECT_BY_PATH(title, ',')||',', ',', 1, 5) x5
             , INSTR(SYS_CONNECT_BY_PATH(title, ',')||',', ',', 1, 6) x6
          FROM t_table a
         WHERE NOT EXISTS (SELECT 1 FROM t_table WHERE upidx = a.idx)
         START WITH upidx IS NULL
         CONNECT BY PRIOR idx = upidx
         ORDER SIBLINGS BY idx
        )
;

SELECT t1.title lv1
     , t2.title lv2
     , t3.title lv3
     , t4.title lv4
     , t5.title lv5
  FROM t_table t1
     , t_table t2
     , t_table t3
     , t_table t4
     , t_table t5
 WHERE t1.upidx IS NULL
   AND t1.idx = t2.upidx(+)
   AND t2.idx = t3.upidx(+)
   AND t3.idx = t4.upidx(+)
   AND t4.idx = t5.upidx(+)
 ORDER BY lv1, lv2, lv3, lv4, lv5
;

마농(manon94)님이 2012-05-21 10:46에 작성한 댓글입니다.

 아~

감사드립니다.

마농님 덕분에 잘 해결했습니다.

알려주세요님이 2012-05-21 16:28에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39461[초보] 100건씩 증가 될수 있는 프로시져 생성문을 요청 드립니다. [1]
하승철
2012-05-23
3986
39459방화벽 외부 서버에서 내부오라클DB로 접속이 안됩니다..
초보자
2012-05-22
4097
39458오라클 변수선언? declare? 질문있습니다.
윤우범
2012-05-21
4225
39457트리형 구조를 가로형태로 만들고 싶습니다. [5]
알려주세요
2012-05-17
5959
39456고수님들 조언 부탁드립니다. 마스터 코드 테이블의 내용 변경 시 이력 유지 방법에 대해서.. [2]
박준석
2012-05-17
4139
39455고수님들께 조언을 구하고자 합니다. [1]
박정우
2012-05-16
3771
39454고수님들께 조언을 구하고자 합니다.. [4]
박정우
2012-05-16
3979
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다