계층형질의
테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용한다
계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다
START WITH | - 어디부터 시작할 것인지를 정한다 ( 최상위 레코드 ) |
CONNECT BY PRIOR | - 계층 구조에서 각 행의 연결 관계를 설정한다 |
PRIOR | - 어디부터 시작할 것인지를 정해 준다. |
START WITH
계층 질의의 루트(부모행)로 사용될 행을 지정한다. 서브 쿼리를 사용할 수도 있다. START WITH 구문에서는 어떤 레코드를 최상위 레코드로 잡을지 지정한다.
CONNECT BY
계층적인 데이터를 쿼리하는 데 사용되는 Oracle SQL의 절이다. 이를 사용하여 부모-자식 관계를 가진 데이터를 조회할 수 있다.
ORDER SIBLINGS BY
CONNECT BY 절 다음에 사용되며, 같은 부모를 가지는 형제 노드들 간의 순서를 지정하는 데 사용된다.
--문제> 테이블에서 id는 각 부서 또는 직원의 고유 식별자,
--name은 부서 또는 직원의 이름, parent_id는 부모 부서 또는 상사의 id를 나타냄.
SELECT id, name
FROM organization
START WITH name = 'CEO' --CEO를 시작으로
CONNECT BY PRIOR id = parent_id --순방향 전개
ORDER SIBLINGS BY name; --형제 노드(동일 LEVEL) 사이 정렬 수행
--결과 출력
ID | Name
------------
1 | CEO
2 | HR Manager
4 | HR Assistant
3 | IT Manager
6 | System Administrator
5 | Software Developer
계층형 질의에서 사용되는 가상 칼럼
LEVEL
루트 데이터면 1, 그 하위 데이터면 2, 하위 데이터가 있을 때마다 1씩 증가
CONNECT_BY_ISLEAF
계층구조 쿼리에서 로우의 최하위 레벨(Leaf) 여부를 반환합니다. 최하위 레벨이면 1, 아니면 0
CONNECT_BY_ROOT
현재행 기준으로 자신의 최고 상위 ROOT를 출력함
--문제> employees 테이블. 각 직원은 자신의 직속 상사의 manager_id를 가지고 있음.
SELECT e1.employee_id,
e1.employee_name,
e2.employee_id AS manager_id,
e2.employee_name AS manager_name
FROM employees e1 LEFT JOIN employees e2 --셀프 JOIN을 LEFT JOIN으로 하여 NULL까지 출력
ON e1.manager_id = e2.employee_id; --자기 자신의 칼럼과 연결지어서 계층형 데이터 출력
--결과 출력
employee_id | employee_name | manager_id | manager_name
------------------------------------------------------
1 | John | NULL | NULL
2 | Alice | 1 | John
3 | Bob | 1 | John
4 | Charlie | 2 | Alice
5 | David | 2 | Alice
6 | Eve | 3 | Bob
'DB > SQL' 카테고리의 다른 글
SQL :: VIEW 뷰 (2) | 2024.04.28 |
---|---|
SQL :: 서브 쿼리 (2) | 2024.04.28 |
SQL :: 집합연산자 (0) | 2024.04.28 |
SQL :: 트랜잭션(Transaction) (0) | 2024.04.27 |
SQL :: 식별자 관계와 비식별자 관계 (0) | 2024.04.27 |