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) 구조 추출에 대해서 알아보았습니다.
미세먼지가 나날이 안좋네요...ㅠ
모두 마스크 챙기시고 건강한 하루 되시길 기원 합니다.
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) 구조 추출에 대해서 알아보았습니다.
미세먼지가 나날이 안좋네요...ㅠ
모두 마스크 챙기시고 건강한 하루 되시길 기원 합니다.
댓글
댓글 쓰기