`CONNECT BY PRIOR` 절은 SQL에서 계층형 데이터를 처리하는 데 사용됩니다. 이 절은 부모-자식 관계를 정의하여 트리 구조를 생성합니다. 부모와 자식의 관계를 명확히 이해하려면 다음과 같은 내용이 도움이 될 수 있습니다:
### 1. **부모와 자식 관계**
- **부모**: 계층 구조에서 상위에 위치하는 행. 자식 행을 포함하는 행입니다.
- **자식**: 계층 구조에서 하위에 위치하는 행. 부모 행에 연결되는 행입니다.
### 2. **`PRIOR` 키워드**
- **`PRIOR`**: `PRIOR` 키워드는 계층형 쿼리에서 부모 노드를 참조하는 데 사용됩니다. 현재 행의 값을 부모 행의 값과 비교하여 계층을 형성합니다.
### 3. **예제 설명**
다음은 계층형 데이터를 사용하는 SQL 쿼리의 예제입니다:
```sql
SELECT
사원번호,
사원명,
입사일자,
매니저사원번호
FROM
사원
START WITH
매니저사원번호 IS NULL
CONNECT BY PRIOR
사원번호 = 매니저사원번호
ORDER SIBLINGS BY
사원번호;
```
#### 예제 데이터
가정할 수 있는 `사원` 테이블의 데이터는 다음과 같습니다:
| 사원번호 | 사원명 | 입사일자 | 매니저사원번호 |
|----------|--------|------------|----------------|
| 1 | 김철수 | 2013-03-01 | NULL |
| 2 | 이영희 | 2013-06-15 | 1 |
| 3 | 박지훈 | 2013-09-22 | 1 |
| 4 | 최민호 | 2014-02-01 | 2 |
| 5 | 정수빈 | 2014-05-30 | 2 |
#### 쿼리 동작 방식
- **`START WITH 매니저사원번호 IS NULL`**: 루트 노드, 즉 최상위 관리자인 `김철수`를 시작점으로 설정합니다.
- **`CONNECT BY PRIOR 사원번호 = 매니저사원번호`**: `PRIOR`를 사용하여 부모와 자식 관계를 정의합니다. 현재 행의 `매니저사원번호`와 이전 행의 `사원번호`가 같을 때, 그 행을 자식으로 간주합니다.
#### 계층 구조 생성
1. **부모 노드 (루트)**:
- `김철수` (사원번호 1, 매니저사원번호 NULL) - 루트 노드
2. **자식 노드**:
- `이영희` (사원번호 2, 매니저사원번호 1) - `김철수`의 자식
- `박지훈` (사원번호 3, 매니저사원번호 1) - `김철수`의 자식
3. **자식의 자식 노드**:
- `최민호` (사원번호 4, 매니저사원번호 2) - `이영희`의 자식
- `정수빈` (사원번호 5, 매니저사원번호 2) - `이영희`의 자식
### 쿼리 결과
이 쿼리는 계층적으로 정렬된 사원 목록을 반환합니다:
| 사원번호 | 사원명 | 입사일자 | 매니저사원번호 |
|----------|--------|------------|----------------|
| 1 | 김철수 | 2013-03-01 | NULL |
| 2 | 이영희 | 2013-06-15 | 1 |
| 3 | 박지훈 | 2013-09-22 | 1 |
| 4 | 최민호 | 2014-02-01 | 2 |
| 5 | 정수빈 | 2014-05-30 | 2 |
### 요약
- **`CONNECT BY PRIOR`**는 부모와 자식 관계를 정의하여 계층형 데이터를 생성합니다.
- **`PRIOR`**는 이전 행의 값을 참조하여 현재 행의 부모를 결정합니다.
- **`START WITH`**는 계층의 루트(최상위)를 정의합니다.
이 기능은 조직도, 제품 카탈로그 등 계층적 구조를 가진 데이터를 효과적으로 조회하고 분석하는 데 유용합니다.
'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글
grouping sets () rollup() (0) | 2024.08.19 |
---|---|
partition by (0) | 2024.08.19 |
join, cross join, natural join (0) | 2024.08.19 |
distinct a||b (0) | 2024.08.19 |
cust_dist() (0) | 2024.08.19 |