Make Be BackEnd

[ORACLE] 계층 쿼리 (hierarchical query) 본문

DB

[ORACLE] 계층 쿼리 (hierarchical query)

Initsave 2024. 5. 23. 11:34

계층 쿼리란 무엇일까? 주로 트리 구조 데이터를 쿼리하는데 사용되며, 재귀쿼리(자기 자신을 반복적으로 참조, 부모-자식 참조)의 일종으로 계층적 데이터를 처리하는 쿼리이다. 

 

oracle 에서는 사용되는 계층 쿼리의 키워드는 어떤 것들이 있을까?

  CONNECT BY PRIOR: 계층 관계를 정의
  START WITH: 계층 쿼리의 루트 노드를 지정
  LEVEL: 현재 행의 계층 레벨을 반환
  SYS_CONNECT_BY_PATH: 경로를 반환

CONNECT_BY_ISLEAF : 현재 행이 트리에서 리프(마지막 노드)인지 여부, 1또는 0의 값을 갖고 1은 리프노드, 0은 리프노드가 아님을 뜻한다.

 

예제를 생성해보자 !!!

 

테이블 생성

 CREATE TABLE "TEST"."COMMENTS" 
   (	"COMMENT_SEQ" NUMBER(*,0), 
	"LVL" NUMBER(*,0) DEFAULT 0, 
	"CONTENT" VARCHAR2(50 BYTE), 
	"PARENT_COMMENT_SEQ" NUMBER(*,0)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  TABLESPACE "USERS" ;
--------------------------------------------------------
--  DDL for Index COMMENTS_PK
--------------------------------------------------------

  CREATE UNIQUE INDEX "TEST"."COMMENTS_PK" ON "TEST"."COMMENTS" ("COMMENT_SEQ") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 
  TABLESPACE "USERS" ;
--------------------------------------------------------
--  Constraints for Table COMMENTS
--------------------------------------------------------

  ALTER TABLE "TEST"."COMMENTS" MODIFY ("COMMENT_SEQ" NOT NULL ENABLE);
  ALTER TABLE "TEST"."COMMENTS" MODIFY ("LVL" NOT NULL ENABLE);
  ALTER TABLE "TEST"."COMMENTS" ADD CONSTRAINT "COMMENTS_PK" PRIMARY KEY ("COMMENT_SEQ")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  TABLESPACE "USERS"  ENABLE;

 

데이터 생성

INSERT INTO COMMENTS (COMMENT_SEQ, LVL, CONTENT, PARENT_COMMENT_SEQ) VALUES (1, 0, '1번 댓글', NULL);
INSERT INTO COMMENTS (COMMENT_SEQ, LVL, CONTENT, PARENT_COMMENT_SEQ) VALUES (2, 0, '2번 댓글', NULL);
INSERT INTO COMMENTS (COMMENT_SEQ, LVL, CONTENT, PARENT_COMMENT_SEQ) VALUES (3, 1, '1번 대댓글', 1);
INSERT INTO COMMENTS (COMMENT_SEQ, LVL, CONTENT, PARENT_COMMENT_SEQ) VALUES (4, 2, '1번 대대댓글', 3);

 

계층 쿼리 구현(부모-자식)

   LEVEL을 이용해서 생성된 컬럼 LVL과 비교

SELECT comment_seq, content, parent_comment_seq, lvl, LEVEL
FROM COMMENTS
START WITH parent_comment_seq IS NULL
CONNECT BY PRIOR comment_seq = parent_comment_seq;

 

 

계층 경로 반환

SELECT comment_seq, content, parent_comment_seq, lvl, LEVEL,  
       SYS_CONNECT_BY_PATH(content, ' -> ') AS path
FROM COMMENTS
START WITH parent_comment_seq IS NULL
CONNECT BY PRIOR comment_seq = parent_comment_seq;

 

여러 쿼리

-- 댓글 전체 경로 조회
SELECT comment_seq, content, SYS_CONNECT_BY_PATH(content, ' -> ') AS path
FROM COMMENTS
START WITH parent_comment_seq IS NULL
CONNECT BY PRIOR comment_seq = parent_comment_seq;

-- 특정 레벨까지 댓글 조회
SELECT comment_seq, content, LEVEL
FROM COMMENTS
START WITH parent_comment_seq IS NULL
CONNECT BY PRIOR comment_seq = parent_comment_seq
AND LEVEL <= 3;

-- 리프 노드(말단 댓글)찾기
SELECT comment_seq, content, CONNECT_BY_ISLEAF as is_leaf
FROM COMMENTS
START WITH parent_comment_seq IS NULL
CONNECT BY PRIOR comment_seq = parent_comment_seq;

 

 

 

 

'DB' 카테고리의 다른 글

[MySQL] UPDATE  (0) 2024.08.24
[MySQL] 계층 쿼리 (hierarchical query)  (0) 2024.05.23
[DBeaver] 디비버 설치(DB 셋팅)  (0) 2024.04.30
[H2] H2 Database  (0) 2023.09.18
[MariaDB] MariaDB - show, use, create, drop  (0) 2023.09.16