달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2007. 8. 2. 13:46

[Oracle] recursive select 그거/DB2007. 8. 2. 13:46

아래와 같은 구조의 테이블이 있다.
이 테이블에는 조직정보가 들어있는데
각 조직에는 상위 조직을 알 수 있는 정보(UP_SOSOK)가 있다.

이 테이블을 이용하여 조직도tree 구조로 select 해보자!!!

SQL> desc organization
 이름                                        널?          유형
 ----------------------------------------- -------- -------------
 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;

ORG_NO ORG_NM              UP_SOS
------ ------------------- ------
IT0000 정보기술실
IT1002  내부통제팀         IT0000
IT3012  차세대TFT          IT0000
IT1017  운영팀             IT0000
IT1003  업무서비스1팀      IT0000
IT2003    화재특종         IT1003
IT2004    해상             IT1003
IT2005    글로벌           IT1003
IT2008    자동차계약       IT1003
IT2009    보상             IT1003
IT2027    손사             IT1003
ORG_NO ORG_NM              UP_SOS
------ ------------------- ------
IT1004  업무서비스2팀      IT0000
IT2006    장기신계약       IT1004
IT2026    장기보전         IT1004
IT2028    퇴직보험         IT1004
IT1007  고객서비스팀       IT0000
IT2013    인터넷           IT1007
IT2014    방카/채널        IT1007
IT2025    통합콜센타       IT1007
IT1008  경영서비스팀       IT0000
IT2010    마케팅지원       IT1008
IT2015    경리             IT1008
ORG_NO ORG_NM              UP_SOS
------ ------------------- ------
IT2018    인사총무         IT1008
IT2029    투융자           IT1008
IT2030    경영정보         IT1008
IT2032    영업포탈         IT1008
IT1019  시스템기술팀       IT0000
IT2019    운영지원         IT1019
IT2020    DW               IT1019
IT1018  서비스지원팀       IT0000
IT2002    디자인           IT1018
IT2033    기획             IT1018
IT2034    공통지원         IT1018

33 개의 행이 선택되었습니다.
SQL>


여기서 주목해야 할 부분은 다음과 같다.

start with column_name = 'xxx'   -- 조회할 초기 정보
connect by prior column_name = column_name -- 리컬씨브 하게 돌아갈 조건
:
Posted by 뽀기