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 38740 게시물 읽기
No. 38740
재귀쿼리 질문드립니다. 하루동안 삽질하구있네요
작성자
노정균(notul2000)
작성일
2011-07-26 18:48
조회수
6,206

재귀쿼리 질문드립니다.

YYMM                 ID             NAME              UPPERID                LEVLEL

201106       9545607        단위농협            9730000S                     50

201106       9545609        중앙농협            9730000S                     50

201106       9730000S        가농협            97100S                         40

201106       9545000          나농협              97200S                      40

201106        97200S               농협                97600                      30

201106       97100P             농협            97600                          30

201106       97600             파 트           9630                                   20

201106       97600              파트           9630                                    20

 

대충 이런 테이블있네요..

레벨이 하위레벨 50부터 40,30,20,10,00(최상위) 이렇게요

업퍼아이디와 아이디를 연결해서 상위레벨찾아가는구조입니다. 대충해서 안맞네요...ㅋㅋㅋ

질문은 최하위레벨에서 최상위레벨을 찾아가게끔 하고싶습니다.

셀프조인걸믄 속도와 같은테이블을 너댓번이나 조인해야하기때문에

좀 간편한 방법이 없을까요? 데이터들은 몇천건정도?

원하는 결과셋은

 ID     NAME     UPPERID   LEVLEL    ID     NAME     UPPERID   LEVLEL  .......

한로우씩들로 쭉 원하는 상위까지 표현하고싶습니다. 그래야 원하는 레벨별로 그룹바이를 시킬수가 있어서요

부탁드립니다.

 

 

이 글에 대한 댓글이 총 2건 있습니다.
WITH t AS
(
SELECT '201106' yymm, '9545607' id, '단위농협' name, '9730000S' upperid, '50' levlel FROM dual
UNION ALL SELECT '201106', '9545609','중앙농협', '9730000S', '50' FROM dual
UNION ALL SELECT '201106', '9730000S', '가농협', '97100P'  , '40' FROM dual
UNION ALL SELECT '201106', '9545000' , '나농협', '97200S'  , '40' FROM dual
UNION ALL SELECT '201106', '97200S'  , '농협'  , '97600'   , '30' FROM dual
UNION ALL SELECT '201106', '97100P'  , '농협'  , '97600'   , '30' FROM dual
UNION ALL SELECT '201106', '97600'   , '파트'  , '9630'    , '20' FROM dual
UNION ALL SELECT '201106', '9630'    , '1단'   , '963'     , '10' FROM dual
UNION ALL SELECT '201106', '963'     , '루트'  , ''        , '00' FROM dual
)
SELECT yymm, id, name, upperid, levlel
     , REGEXP_SUBSTR(ids, '[^-]+', 1, 1) id_00
     , REGEXP_SUBSTR(nms, '[^-]+', 1, 1) nm_00
     , REGEXP_SUBSTR(ids, '[^-]+', 1, 2) id_10
     , REGEXP_SUBSTR(nms, '[^-]+', 1, 2) nm_10
     , REGEXP_SUBSTR(ids, '[^-]+', 1, 3) id_20
     , REGEXP_SUBSTR(nms, '[^-]+', 1, 3) nm_20
     , REGEXP_SUBSTR(ids, '[^-]+', 1, 4) id_30
     , REGEXP_SUBSTR(nms, '[^-]+', 1, 4) nm_30
     , REGEXP_SUBSTR(ids, '[^-]+', 1, 5) id_40
     , REGEXP_SUBSTR(nms, '[^-]+', 1, 5) nm_40
     , REGEXP_SUBSTR(ids, '[^-]+', 1, 6) id_50
     , REGEXP_SUBSTR(nms, '[^-]+', 1, 6) nm_50
  FROM (
        SELECT yymm, id, name, upperid, levlel
             , SYS_CONNECT_BY_PATH(id  , '-') ids
             , SYS_CONNECT_BY_PATH(name, '-') nms
          FROM t
         START WITH yymm = '201106'
                AND levlel = '00'
         CONNECT BY PRIOR yymm = yymm
                AND PRIOR id = upperid
        )
;
마농(manon94)님이 2011-07-27 09:30에 작성한 댓글입니다.

아직 해결이 안되셨나보네요...

원하는 결과가 이런건가요?..

WITH a AS

     (SELECT '201106' yymm, '9545607' ID, '단위농협' NAME, '9730000S' upperid,

             '50' levlel

        FROM DUAL

      UNION ALL

      SELECT '201106', '9545609', '중앙농협', '9730000S', '50'

        FROM DUAL

      UNION ALL

      SELECT '201106', '9730000S', '가농협', '97100S', '40'

        FROM DUAL

      UNION ALL

      SELECT '201106', '9545000', '나농협', '97200S', '40'

        FROM DUAL

      UNION ALL

      SELECT '201106', '97200S', '농협', '97600', '30'

        FROM DUAL

      UNION ALL

      SELECT '201106', '97100S', '농협', '97600', '30'

        FROM DUAL

      UNION ALL

      SELECT '201106', '97100P', '농협', '97600', '30'

        FROM DUAL

      UNION ALL

      SELECT '201106', '97600', '파트', '9630', '20'

        FROM DUAL)

SELECT   max(decode(level,1,id)) id1, max(decode(level,1,name)) name1, max(decode(level,1,upperid)) upperid1, max(decode(level,1,levlel)) levlel1,

         max(decode(level,2,id)) id2, max(decode(level,2,name)) name2, max(decode(level,2,upperid)) upperid2, max(decode(level,2,levlel)) levlel2,

         max(decode(level,3,id)) id3, max(decode(level,3,name)) name3, max(decode(level,3,upperid)) upperid3, max(decode(level,3,levlel)) levlel3,

         max(decode(level,4,id)) id4, max(decode(level,4,name)) name4, max(decode(level,4,upperid)) upperid4, max(decode(level,4,levlel)) levlel4

      FROM a

CONNECT BY PRIOR upperid=ID

START with id='9545607'

 

데이터는 중간에 끊기는 부분이 있어서 일부 수정했습니다...

1님이 2011-07-27 09:53에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38743실행계획 문의 [4]
레이첼
2011-07-27
4736
38742같은필드 나나내지 않기..오라클8 [4]
아폴론
2011-07-27
4308
38741우리가 사용하는 서버 프로그램이 에러를 냈습니다. [1]
소금
2011-07-27
4174
38740재귀쿼리 질문드립니다. 하루동안 삽질하구있네요 [2]
노정균
2011-07-26
6206
38739반복되는 특정문자열 한개만 두고 삭제할수있을까요? [2]
이동호
2011-07-26
4248
38738쿼리문의 [2]
레이첼
2011-07-26
4197
38737CREATE TABLE ~ AS SELECT 시 컬럼 크기 변경 [2]
장동신
2011-07-26
4614
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다