본문 바로가기
Oracle

계층 쿼리 문법

by Mecodata 2024. 11. 14.

CONNECT BY PRIOR

- 컬럼 간의 부모-자식 관계 지정에 사용

- CONNECT BY PRIOR (부모 컬럼) = (자식 컬럼) 형식으로 입력

- 부모 컬럼과 자식 컬럼은 같은 테이블 내에 있어도 상관 X

ex) CONNECT BY PRIOR post_num = parent_num (post_num = 게시글 번호, parent_num = 부모 게시글 번호)

→ post_num(부모)과 parent_num(자식)이 일치하는 경우를 조건으로 설정

→ post_num이 부모인 경우 이 부모 게시글 아래에 자식 게시글(답글)을 가져오는 계층 구조 설정

 

START WITH

- 계층 쿼리에서 탐색을 시작할 특정 루트 노드를 지정할 때 사용

 ex) START WITH parent_num IS NULL → parent_num이 NULL이면 최상위 부모 글(독립적인 게시글)로 간주

 

ORDER SIBLINGS BY

- 동일한 부모 컬럼을 가진 자식 컬럼들을 특정 컬럼을 기준으로 정렬할 때 사용

ex) ORDER SIBLINGS BY      

      CASE WHEN parent_num IS NULL THEN create_dt END DESC,
      CASE WHEN parent_num IS NOT NULL THEN create_dt END ASC

parent_num이 NULL(부모 게시글)이면 create_dt 기준 내림차순, parent_num이 NOT NULL(답글)이면 create_dt 기준 오름차순 정렬

 

예시

SELECT *
FROM(
    SELECT * 
    FROM board
    CONNECT BY PRIOR post_num = parent_num -- post_num(부모), parent_num(자식) 관계 설정
    START WITH parent_num IS NULL -- 부모 글이 최상위 계층
    ORDER SIBLINGS BY 
        CASE WHEN parent_num IS NULL THEN create_dt END DESC,  -- 부모 글은 최신순
        CASE WHEN parent_num IS NOT NULL THEN create_dt END ASC -- 답글은 오래된 순
)    
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY; -- 처음 데이터(0)부터 (5)개만 반환

 

LEVEL

- 현재 행이 계층 구조에서 어떤 깊이(레벨)에 위치하는지를 나타내는 가상 컬럼

 

SYS_CONNECT_BY_PATH

- 루트 노드부터 현재 행까지의 경로를 문자열로 반환

 

CONNECT_BY_ISLEAF

- 현재 행이 리프 노드(즉, 자식이 없는 최하위 노드)인지 여부를 확인하는 가상 컬럼

 

CONNECT_BY_ROOT

- 각 행의 최상위 루트 노드 값을 반환

 

 

예시

LEVEL

SELECT LEVEL, employee_id, manager_id
FROM employees
CONNECT BY PRIOR employee_id = manager_id
START WITH manager_id IS NULL;

 

SYS_CONNECT_BY_PATH

SELECT SYS_CONNECT_BY_PATH(employee_name, '/') AS path, employee_id, manager_id
FROM employees
CONNECT BY PRIOR employee_id = manager_id
START WITH manager_id IS NULL;

 

CONNECT_BY_ISLEAF

SELECT employee_name, CONNECT_BY_ISLEAF AS is_leaf
FROM employees
CONNECT BY PRIOR employee_id = manager_id
START WITH manager_id IS NULL;

 

CONNECT_BY_ROOT

SELECT CONNECT_BY_ROOT employee_id AS root_id, employee_name, employee_id, manager_id
FROM employees
CONNECT BY PRIOR employee_id = manager_id
START WITH manager_id IS NULL;

'Oracle' 카테고리의 다른 글

Oracle이란  (0) 2024.11.14

댓글