Data Analysis 데이터 분석/SQL 통한 Database 관리

start with, connect by prior c, order siblings by

Queen Julia 2024. 8. 20. 19:03

select c3 from tab1
start with c2 is null
connect by prior c1=c2 order siblings by c3 desc

이 SQL 쿼리는 계층형(트리 구조) 데이터를 처리할 때 사용되는 Oracle SQL 문법으로, `CONNECT BY` 절을 통해 트리 구조를 정의하고 `ORDER SIBLINGS BY`를 사용하여 동일한 계층 내의 형제 노드들을 정렬합니다. 여기서 각 구문이 의미하는 바를 설명하겠습니다.

### 쿼리 분석

```sql
SELECT c3
FROM tab1
START WITH c2 IS NULL
CONNECT BY PRIOR c1 = c2
ORDER SIBLINGS BY c3 DESC;
```

#### 1. **`START WITH` 절**
   - **기능**: 계층 구조의 루트 노드를 정의합니다.
   - **`c2 IS NULL`**: `c2`가 `NULL`인 행을 트리의 루트로 설정합니다.
   - 이 조건을 만족하는 행이 계층 구조의 최상위 레벨에서 시작됩니다.

#### 2. **`CONNECT BY PRIOR` 절**
   - **기능**: 계층 구조에서 부모와 자식 노드 간의 관계를 정의합니다.
   - **`PRIOR c1 = c2`**:
     - `c1`은 부모 노드를 나타내고, `c2`는 자식 노드를 나타냅니다.
     - `PRIOR` 키워드는 바로 이전 레벨에서 선택된 값(`c1`)을 가리키며, 이를 현재 레벨의 `c2`와 비교하여 부모-자식 관계를 설정합니다.
   - 이 조건에 따라 트리가 확장되며, 루트에서 자식 노드들이 연결됩니다.

#### 3. **`ORDER SIBLINGS BY` 절**
   - **기능**: 동일한 부모를 가진 형제 노드들 간의 순서를 지정합니다.
   - **`ORDER SIBLINGS BY c3 DESC`**:
     - 각 계층에서 동일한 부모를 가진 형제 노드들을 `c3` 열을 기준으로 내림차순(`DESC`)으로 정렬합니다.
   - 이 정렬은 형제 노드 간의 순서만 영향을 주며, 전체 트리의 구조에는 영향을 미치지 않습니다.

### 예시 상황

예를 들어, `tab1` 테이블에 다음과 같은 데이터가 있다고 가정해 보겠습니다:

| c1  | c2  | c3        |
|-----|-----|-----------|
| 1   | NULL | Alpha    |
| 2   | 1    | Beta     |
| 3   | 1    | Gamma    |
| 4   | 2    | Delta    |
| 5   | 3    | Epsilon  |

#### 동작 방식:
1. **`START WITH c2 IS NULL`**:
   - `c2`가 `NULL`인 첫 번째 행(`c1 = 1`)이 루트가 됩니다.

2. **`CONNECT BY PRIOR c1 = c2`**:
   - `c1 = 1`을 부모로 하여 `c2 = 1`인 행들을 자식으로 연결합니다.
   - `c1 = 2`와 `c1 = 3`이 자식으로 연결됩니다.
   - 이 과정이 계속되면서 전체 트리가 확장됩니다.

3. **`ORDER SIBLINGS BY c3 DESC`**:
   - `c3` 열을 기준으로 동일한 부모를 가진 형제 노드들을 내림차순으로 정렬합니다.
   - 예를 들어, `c1 = 1`의 자식인 `Beta`와 `Gamma`가 `Gamma` > `Beta` 순으로 정렬됩니다.

### 최종 결과

이 쿼리는 `tab1` 테이블에서 계층 구조를 따라 `c3` 열을 출력하며, 각 계층에서 형제 노드들은 `c3` 기준으로 내림차순으로 정렬된 결과를 반환합니다.

### 요약

- **`START WITH`**: 계층 구조의 시작점(루트)을 정의합니다.
- **`CONNECT BY PRIOR`**: 부모와 자식 간의 관계를 정의하여 트리 구조를 만듭니다.
- **`ORDER SIBLINGS BY`**: 동일한 부모를 가진 형제 노드들을 특정 열을 기준으로 정렬합니다.

이 쿼리를 사용하면 복잡한 계층형 데이터를 쉽게 탐색하고, 원하는 대로 정렬된 결과를 얻을 수 있습니다.

'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글

left outer join  (0) 2024.08.20
cube()  (0) 2024.08.20
grouping sets () rollup()  (0) 2024.08.19
partition by  (0) 2024.08.19
connect by prior의 부모 자식 아는 법  (0) 2024.08.19