일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바공부
- 스프링 부트와 JPA
- java
- 스프링입문
- REGEXP_SUBSTR
- Secure Coding
- JPA
- Java의정석
- 스프링 핵심원리
- 스프링
- inflearn
- 분석함수
- Python
- 계층 쿼리
- docker
- Spring
- 스프링MVC
- 제네릭
- 자바연습문제
- 불친절한SQL프로그래밍
- 시큐어코딩
- 서블릿
- 자바의정석 연습문제
- 김영한
- 자바의정석
- 이것이자바다
- 인프런
- DispatcherServlet
- Numpy
- 불친절한 SQL 프로그래밍
- Today
- Total
Continuous Challenge
[불친절한 SQL 프로그래밍] [16장] 계층 쿼리(1) (START WITH, CONNECT BY) 본문
[불친절한 SQL 프로그래밍] [16장] 계층 쿼리(1) (START WITH, CONNECT BY)
응굥 2019. 12. 12. 10:4416.1 계층 쿼리 절
계층 쿼리 절은 오라클 데이터베이스의 전통적인 계층 쿼리 구문이다.
16.1.1 기본 문법
계층 쿼리 절은 WHERE 절 다음에 기술하며, FROM절이 수행된 후 수행된다.
START WITH절과 CONNECT BY 절로 구성되며, START WITH 절이 수행된 후 CONNECT BY 절이 수행된다.
START WITH절은 생략이 가능하다.
[START WITH condition] CONNECT BY [NOCYCLE] condition
절 | 설명 |
START WITH 절 | 루트 노드를 생성하며 1번만 수행 |
CONNECT BY 절 | 루트 노드의 하위 노드를 생성하며 조회 결과가 없을 때까지 반복 수행 |
유형 | 항목 | 설명 |
연산자 | PRIOR | 직전 상위 노드의 값을 반환 |
CONNECT_BY_ROOT | 루트 노드의 값을 반환 | |
슈도 칼럼 | LEVEL | 현재 레벨을 반환 |
CONNECT_BY_ISLEAF | 리프 노드인 경우 1, 아니면 0을 반환 | |
CONNECT_BY_ISCYCLE | 루프가 발생한 경우 1, 아니면 0을 반환 | |
함수 | SYS_CONNECT_BY_PATH | 루트 노드에서 현재 노드까지의 경로를 반환 |
16.1.2 동작 원리
계층 쿼리 절은 START WITH 절로 루트 노드를 생성한 후, 결과가 없을 때까지 CONNECT 절을 반복 수행하여 하위 노드를 생성한다.
1단계 (LEVEL = 1)
START WITH절을 수행하여 루트 노드를 생성한다. START WITH절은 WHERE절과 유사하게 동작한다.
2단계 (LEVE = 2)
CONNECT BY절로 임시 테이블에 저장된 1단계 결과와 emp테이블을 조인한다. CONNECT BY절도 WHERE절과 유사하게 동작한다.
3단계 (LEVEL = 3)
CONNECT BY 절로 임시 테이블에 저장된 2단계 결과와 emp 테이블을 조인한다.
4단계 (LEVEL = 4)
CONNECT BY 절로 임시 테이블에 저장된 3단계 결과와 emp 테이블을 조인한다.
5단계 (LEVEL = 5)
CONNECT BY 절로 임시테이블에 저장된 4단계 결과와 emp 테이블을 조인한다.
결과가 반환되지 않으면 CONNECT BY 절의 수행을 멈추고 수행 결과가 저장된 임시 테이블을 조회하여 결과를 반환한다.
16.1.3 전개 방향
순환 관계는 순방향 또는 역방향으로 전개할 수 있다. 순방향 전개와 역방향 전개는 데이터 모델 상의 전개 방향이 반대일 뿐 동작 원리는 동일하다.
전개 방향 | START WITH 절 | CONNECT BY 절 | |
순방향 전개 | 부모 -> 자식 | 부모 노드 조회 | PK에 PRIOR 기술 |
역방향 전개 | 자식 -> 부모 | 자식 노드 조회 | FK에 PRIOR 기술 |
순방향 전개는 START WITH 절로 부모 노드를 조회하고, CONNECT BY 절을 통해 자식 노드로 계층을 전개한다. PK(empno)에 PRIOR 연산자를 기술하여 현재 노드의 mgr가 부모 노드의 empno인 행을 조회한다.
역방향 전개는 START WITH절로 자식 노드를 조회하고, CONNECT BY 절을 통해 부모 노드로 계층을 전개한다. FK(mgr)에 PRIOR 연산자를 기술하여 현재 노드의 empno가 자식 노드의 mgr인 행을 조회한다.
16.1.4 계층 정렬
계층 쿼리 절은 형제 노드의 행을 정렬하기 위해 SIBLINGS 키워드를 제공한다.
계층 쿼리 절에 ORDER BY 절을 사용하면 계층 구조와 무관하게 행이 정렬된다.
ORDER BY 절에 SIBLINGS 키워드를 사용하면 형제 노드 내에서만 행이 정렬되기 때문에 계층 구조를 유지한 상태로 행을 정렬할 수 있다.
CLARK, BLAKE, JONES 는 형제 노드다. sal 순서로 행이 정렬된다.
BLAKE의 하위 노드인 JAMES ~ ALLEN도 sal 순서로 행이 정렬된다.
16.1.5 루프 처리
부모 노드가 현재 노드의 자식 노드로 연결되면 루프(loop)가 발생한다. 계층 쿼리 절은 루프를 처리하기 위해 NOCYCLE 키워드와 CONNECT_BY_ISCYCLE 슈도 칼럼을 제공한다.
CONNECT BY 절에 NOCYCLE 키워드를 기술하면 루프가 발생한 노드를 전개하지 않는다.
'Study > 불친절한 SQL 프로그래밍' 카테고리의 다른 글
[불친절한 SQL 프로그래밍] [24장] 정규 표현식(1) (feat. REGEXP_SUBSTR) (0) | 2019.12.18 |
---|---|
[불친절한 SQL 프로그래밍] [16장] 계층 쿼리(2) (WITH, SEARCH, CYCLE) (0) | 2019.12.17 |
[불친절한 SQL 프로그래밍] [15장] Top-N 쿼리 - 15.1 기본 문법 (ROWNUM 방식, 분석함수(ROW_NUMBER, PERCENT_RANK) 방식) (0) | 2019.12.12 |
[불친절한 SQL 프로그래밍] [14장] 분석 함수 - 14.2 분석 함수 (LAG, LEAD, LISTAGG 함수) (0) | 2019.12.06 |
[불친절한 SQL 프로그래밍] [12장] 서브 쿼리 - 12.5 WITH절 (0) | 2019.12.06 |