[Oracle] recursive select 그거/DB2007. 8. 2. 13:46
아래와 같은 구조의 테이블이 있다.
이 테이블에는 조직정보가 들어있는데
각 조직에는 상위 조직을 알 수 있는 정보(UP_SOSOK)가 있다.
이 테이블을 이용하여 조직도를 tree 구조로 select 해보자!!!
이름 널? 유형
----------------------------------------- -------- -------------
ORG_NO NOT NULL VARCHAR2(6)
ORG_CAT NOT NULL VARCHAR2(2)
UP_SOSOK VARCHAR2(6)
ORG_NM VARCHAR2(50)
테이블의 데이터를 select 해보자!
SQL> select * from organization;
ORG_NO ORG_NM UP_SOS OR
------ -------------------- ------ --
IT0000 정보기술실 03
IT1002 내부통제팀 IT0000 02
IT3012 차세대TFT IT0000 02
IT1017 운영팀 IT0000 02
IT1003 업무서비스1팀 IT0000 02
IT1004 업무서비스2팀 IT0000 02
IT1007 고객서비스팀 IT0000 02
IT1008 경영서비스팀 IT0000 02
IT1019 시스템기술팀 IT0000 02
IT1018 서비스지원팀 IT0000 02
IT2003 화재특종 IT1003 01
ORG_NO ORG_NM UP_SOS OR
------ -------------------- ------ --
IT2004 해상 IT1003 01
IT2005 글로벌 IT1003 01
IT2008 자동차계약 IT1003 01
IT2009 보상 IT1003 01
IT2027 손사 IT1003 01
IT2006 장기신계약 IT1004 01
IT2026 장기보전 IT1004 01
IT2028 퇴직보험 IT1004 01
IT2013 인터넷 IT1007 01
IT2014 방카/채널 IT1007 01
IT2025 통합콜센타 IT1007 01
ORG_NO ORG_NM UP_SOS OR
------ -------------------- ------ --
IT2010 마케팅지원 IT1008 01
IT2015 경리 IT1008 01
IT2018 인사총무 IT1008 01
IT2029 투융자 IT1008 01
IT2030 경영정보 IT1008 01
IT2032 영업포탈 IT1008 01
IT2002 디자인 IT1018 01
IT2033 기획 IT1018 01
IT2034 공통지원 IT1018 01
IT2019 운영지원 IT1019 01
IT2020 DW IT1019 01
33 개의 행이 선택되었습니다.
아.. 복잡하다. 조직도라고 하기에는 어설프다.
이제, 이 테이블의 데이터를 select 한 번만으로 리컬~~~~~~~~~~씨브 하게 뽑아보자!
SQL> select org_no, lpad(' ', 3*(1/org_cat)) || org_nm org_nm, up_sosok from organization start with org_no = 'IT0000' connect by prior org_no = up_sosok order siblings by up_sosok;
------ ------------------- ------
IT0000 정보기술실
IT1002 내부통제팀 IT0000
IT3012 차세대TFT IT0000
IT1017 운영팀 IT0000
IT1003 업무서비스1팀 IT0000
IT2003 화재특종 IT1003
IT2004 해상 IT1003
IT2005 글로벌 IT1003
IT2008 자동차계약 IT1003
IT2009 보상 IT1003
IT2027 손사 IT1003
------ ------------------- ------
IT1004 업무서비스2팀 IT0000
IT2006 장기신계약 IT1004
IT2026 장기보전 IT1004
IT2028 퇴직보험 IT1004
IT1007 고객서비스팀 IT0000
IT2013 인터넷 IT1007
IT2014 방카/채널 IT1007
IT2025 통합콜센타 IT1007
IT1008 경영서비스팀 IT0000
IT2010 마케팅지원 IT1008
IT2015 경리 IT1008
------ ------------------- ------
IT2018 인사총무 IT1008
IT2029 투융자 IT1008
IT2030 경영정보 IT1008
IT2032 영업포탈 IT1008
IT1019 시스템기술팀 IT0000
IT2019 운영지원 IT1019
IT2020 DW IT1019
IT1018 서비스지원팀 IT0000
IT2002 디자인 IT1018
IT2033 기획 IT1018
IT2034 공통지원 IT1018
33 개의 행이 선택되었습니다.
여기서 주목해야 할 부분은 다음과 같다.
connect by prior column_name = column_name -- 리컬씨브 하게 돌아갈 조건
'그거 > DB' 카테고리의 다른 글
A 테이블의 특정 컬럼의 값을 B 테이블의 특정 컬럼 값으로 UPDATE 하는 PL/SQL (0) | 2008.12.08 |
---|---|
TOAD에서 Explain plan 사용하기 (0) | 2007.08.02 |
테이블의 FK 잠깐 꺼 놓는 방법 (0) | 2007.08.01 |
자주 참조하는 딕셔너리 (0) | 2007.01.29 |
[오라클 10g와 그리드] 스트림 기능 이용하기 (0) | 2007.01.29 |