Oracle 트리(Tree) 구조 추출

프로젝트 작업을 하다보면 오라클(Oracle)이건 Mssql이건 또는 Mysql이건 모든 곳에서 엄청나게 많이 사용하고 구현해야 하는것이 트리(Tree) 구현일 것입니다.
MSSQL에서의 트리(계층형) 구현을 보고 싶으시면 아래의 바로가기를 참고해주세요.

<== MSSQL 계층형 부서 와 사용자 트리 쿼리 바로가기 ==>



그럼 오라클에서는 어떻게 구현해야 할까요?
하여 오늘은 Oracle 트리(Tree) 구조 추출에 대해서 알아보겠습니다.





먼저 테스트 테이블을 만들어보겠습니다.

CREATE TABLE TREE_TEST_TABLE
(
  CD_SEQ    NUMBER                              NOT NULL,
  M_CD_SEQ  NUMBER                              NOT NULL,
  CD_DETCD  CHAR(4 BYTE)                        NOT NULL,
  CD_DETNM  VARCHAR2(100 BYTE)                  NOT NULL,
  P_CD_SEQ  NUMBER,
  UNIT      VARCHAR2(5 BYTE),
  USE_FLAG  NUMBER(1)                           NOT NULL,
  UP_ID     CHAR(7 BYTE)                        NOT NULL,
  UP_DT     DATE                                NOT NULL
)
TABLESPACE USERS
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

여기서 중요한 칼럼은 CD_SEQ와 P_CD_SEQ 칼럼 입니다.
부모와 자식같은 연결고리 칼럼으로 Hierarchy(계층구조)라고도 많이 불리우지요.




구현 할 테스트 테이블을 만들었으니 이제 데이터를 넣어보겠습니다.

Insert into TREE_TEST_TABLE
(
   CD_SEQ
   , M_CD_SEQ
   , CD_DETCD
   , CD_DETNM
   , P_CD_SEQ
   , UNIT
   , USE_FLAG
   , UP_ID
   , UP_DT
)
SELECT 6, 11, 'A0', '시작레벨1', NULL, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:40:36', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 7, 4, 'A', '시작레벨1-1', 6, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:40:51', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 8, 5, 'A', '시작레벨1-1-1', 7, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:41:32', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 9, 6, 'A', '시작레벨1-1-1-1', 8, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:42:10', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 11, 7, '1101', '시작레벨1-1-1-1-1', 9, 'TON', 1, 'Admin', TO_DATE('12/26/2019 13:44:26', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 12, 7, '1102', '시작레벨1-1-1-1-2', 9, 'TON', 1, 'Admin', TO_DATE('12/26/2019 13:45:34', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 13, 7, '1201', '시작레벨1-1-1-1-3', 9, 'TON', 1, 'Admin', TO_DATE('12/26/2019 13:46:11', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 18, 12, 'B0', '시작레벨2', NULL, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:53:43', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 19, 4, 'A', '시작레벨2-1', 18, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:54:41', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 20, 5, 'A', '시작레벨2-1-1', 19, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:55:40', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 21, 6, 'B', '시작레벨2-1-1-1', 20, NULL, 1, 'Admin', TO_DATE('12/26/2019 13:56:13', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 22, 7, '1101', '시작레벨2-1-1-1', 21, 'TON', 1, 'Admin', TO_DATE('12/26/2019 13:57:13', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 23, 7, '1201', '시작레벨2-1-1-2', 21, 'TON', 1, 'Admin', TO_DATE('12/26/2019 13:57:25', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 24, 7, '1301', '시작레벨2-1-1-3', 21, 'TON', 1, 'Admin', TO_DATE('12/26/2019 13:57:31', 'MM/DD/YYYY HH24:MI:SS') FROM DUAL
;

COMMIT;

꼭 커밋을 해주셔야 한다는거 알고계시줘...ㅎ
아래는 SELECT * FROM TREE_TEST_TABLE 쿼리를 실행하여 추출한 정보 입니다.






마지막으로 제일 중요한 위의 데이타를 원하는 트리(계층형) 구조로 추출하는 쿼리를 알아보겠습니다.

SELECT LPAD(' ', 2*(LEVEL-1)) || CD_DETNM AS DE_DETNM,
       CD_SEQ,
       P_CD_SEQ
FROM TREE_TEST_TABLE
START WITH P_CD_SEQ IS NULL
CONNECT BY PRIOR CD_SEQ = P_CD_SEQ;

사실 쿼리는 위와 같이 간단 합니다. 오라클에서는 많은 것을 지원하는데 그중 하나가 계층형을 쉽게 구현 할 수 있는 CONNECT BY PRIOR 입니다.

아래는 위 쿼리를 실행했을 때 나타나는 정보 입니다.


짜잔~ 어떠신가요...ㅎ
원하시는 결과를 얻으셨나요...ㅎ

여기까지 Oracle 트리(Tree) 구조 추출에 대해서 알아보았습니다.
미세먼지가 나날이 안좋네요...ㅠ
모두 마스크 챙기시고 건강한 하루 되시길 기원 합니다.

댓글

이 블로그의 인기 게시물

껌 떼는 법 (완벽 제거)

학점 계산기 (백분위 환산) 완벽 정리

[엑셀] 셀에 수식 적용하는 모든 것 완벽 정리