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 39829 게시물 읽기
No. 39829
connect by 질문
작성자
최인수(hinge)
작성일
2012-12-03 14:48
조회수
7,339

아래와 같은 형식의 데이터가 있습니다.

WITH tmp AS

(

SELECT '대분류1' as codeName, 'A00' as childCode, '000' as upperCode FROM DUAL

UNION ALL SELECT '중분류1', 'A01', 'A00' FROM DUAL

UNION ALL SELECT '소분류1', 'A02', 'A01' FROM DUAL

UNION ALL SELECT '소분류2', 'A03', 'A02' FROM DUAL

UNION ALL SELECT '소분류3', 'A04', 'A03' FROM DUAL

UNION ALL SELECT '소분류4', 'A05', 'A03' FROM DUAL

UNION ALL SELECT '소분류5', 'A06', 'A03' FROM DUAL

UNION ALL SELECT '소분류6', 'A07', 'A03' FROM DUAL

UNION ALL SELECT '중분류2', 'A08', 'A01' FROM DUAL

UNION ALL SELECT '소분류7', 'A09', 'A08' FROM DUAL

UNION ALL SELECT '소분류8', 'A10', 'A09' FROM DUAL

UNION ALL SELECT '소분류9', 'A11', 'A09' FROM DUAL)

SELECT codeName, upperCode, childCode from tmp

start with upperCode = '000'

 

 그런데 전체를 리스트업하는 것이 아니고 특정 소분류 코드만 전달되었을 경우 (예: A04, A05, A10) 

소분류가 속해있는 상위 단계까지 SELECT 할려면 어떻게 해야 할까요?

결국 아래와 같은 데이터 구조를 뽑아야 합니다.

 

대분류 중분류 소분류
대분류1 중분류1 소분류3
    소분류4
  중분류2 소분류8


 

 

 

 

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

지금 확인해보니 질문 데이터가 조금 애매하네요.

sys_connect_by_path로 역추적해서 like 검색으로 해결습니다.

최인수(hinge)님이 2012-12-03 15:35에 작성한 댓글입니다.

음 이런것은 어떠신가요 ?

역방향으로 푼 후에 다시 정방향으로 푼것입니다.

값만 필요하다면 정방향으로 다시 푸실필요는 없을것같고 group by 만 해주면 될것 같습니다.

 

WITH tmp AS
(
   SELECT '대분류1' as codeName, 'A00' as childCode, '000' as upperCode FROM DUAL
    UNION ALL SELECT '중분류1', 'A01', 'A00' FROM DUAL
    UNION ALL SELECT '소분류1', 'A02', 'A01' FROM DUAL
    UNION ALL SELECT '소분류2', 'A03', 'A02' FROM DUAL
    UNION ALL SELECT '소분류3', 'A04', 'A03' FROM DUAL
    UNION ALL SELECT '소분류4', 'A05', 'A03' FROM DUAL
    UNION ALL SELECT '소분류5', 'A06', 'A03' FROM DUAL
    UNION ALL SELECT '소분류6', 'A07', 'A03' FROM DUAL
    UNION ALL SELECT '중분류2', 'A08', 'A01' FROM DUAL
    UNION ALL SELECT '소분류7', 'A09', 'A08' FROM DUAL
    UNION ALL SELECT '소분류8', 'A10', 'A09' FROM DUAL
    UNION ALL SELECT '소분류9', 'A11', 'A09' FROM DUAL)
SELECT LPAD('-', LEVEL, '-') || LEVEL AS LV  -- 정방향
      , codeName
      ,upperCode
      ,childCode
  FROM ( 
        SELECT  -- 역방향
                codeName
              ,upperCode
              ,childCode
        from tmp
        start with CHILDCODE IN ('A04', 'A05', 'A10')
        CONNECT BY PRIOR  UPPERCODE = CHILDCODE
        GROUP BY codeName
              ,upperCode
              ,childCode
        )
   start with UPPERCODE = '000'
   CONNECT BY PRIOR  CHILDCODE = UPPERCODE

사과나무(nidty)님이 2012-12-05 11:06에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39848통계 쿼리 도와주세요. [2]
박주영
2012-12-04
5933
39847DB 링크 도움이 절실히 필요합니다.
새하정
2012-12-04
6492
39843replace function 도움 요청.... [1]
김동길
2012-12-04
6292
39829connect by 질문 [2]
최인수
2012-12-03
7339
39825범위비교 쿼리 질문드립니다. [1]
김완경
2012-11-29
6321
39824조언부탁드립니다. [1]
부족한타블로
2012-11-29
6171
39823쿼리문의드립니다. [2]
슈펭
2012-11-29
6618
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다