SQL 통한 Database 관리

connect by prior의 부모 자식 아는 법

JBS 12 2024. 8. 19. 00:19

`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`**는 계층의 루트(최상위)를 정의합니다.

이 기능은 조직도, 제품 카탈로그 등 계층적 구조를 가진 데이터를 효과적으로 조회하고 분석하는 데 유용합니다.

'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