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 |