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;
댓글