💡 계층형 쿼리 CONNECT BY 사용법
✔ 계층적 구조 : 부모 - 자식 간의 관계를 알 수 있는 컬럼 존재하는 경우!
(예시)
[TABLE : A]
CHILD | PARENT | VALUE |
1 | NULL | A |
2 | 1 | B |
3 | 1 | C |
4 | 2 | D |
5 | 2 | E |
6 | 3 | F |
LEVEL별로 계층구조를 뽑아내고 싶을 때 쓰는 것이 CONNECT BY!
A 테이블에서 CHILD, PARENT 컬럼을 통해 부모-자식 관계 알 수 있음!
일단 쿼리부터 보시져!
SELECT LEVEL, A.*, CONNECT_BY_ISCYCLE ISCYCLE
FROM A
CONNECT BY NOCYCLE PRIOR CHILD = PARENT
ORDER SIBLINGS BY PARENT
[결과]
LEVEL | CHILD | PARENT | VALUE | ISCYCLE |
1 | 1 | NULL | A | 0 |
2 | 2 | 1 | B | 0 |
2 | 3 | 1 | C | 0 |
3 | 4 | 2 | D | 0 |
3 | 5 | 2 | E | 0 |
4 | 6 | 3 | F | 0 |
- CONNECT BY : 연결 고리 통해 목록을 가져오는 부분
- CONNECT BY PRIOR A = B : PRIOR 붙어 있는 부분이 그 전 데이터를 보는 부분
- => PRIOR A = B 그 전 데이터 A와 현재 데이터 B가 같을 때 가져온다.
- START WITH : 시작점 지정 (보통 부모키가 NULL 일 경우)
✔ [SELECT 위치]
- CONNECT BY 사용해서 계층형 쿼리 가져오면 LEVEL 이라는 데이터 가져올 수 있다.
- CONNECT_BY_ROOT 를 통해 SELECT에서 최상위 정보를 가져올 수 있다.
- CONNECT_BY_ISCYCLE 값이 1이면 오류 지점
-> ORA-01436 : CONNECT BY 의 루프가 발생되었습니다. 쿼리 에러인지 확인하는 방법!
✔ [ORDER BY 위치]
- ORDER SIBLINGS BY ~ : 계층구조는 그대로 유지하면서 동일 부모를 가진 자식들끼리의 정렬 기준을 두는 것!
✔ [CONNECT BY 위치]
- CONNECT BY NOCYCLE ~ : 루프 사이클은 돌리지 않겠다.
-> ORA-01436 : CONNECT BY 의 루프가 발생되었습니다. 데이터 문제 있을 경우 해결책!
'IT > SQL' 카테고리의 다른 글
[SQL] MERGE문 (0) | 2023.05.15 |
---|---|
[SQL] SQL 기본 - DDL, DML, DCL (0) | 2023.01.30 |