[개발]프로그래밍/sql
[oracle] START WITH ... CONNECT BY - 계층형 쿼리
좋은 블로그
2016. 10. 25. 08:21
1. START WITH ... CONNECT BY - 역할
오라클에서 지원하는 계층적인 정보를 표현할 수 있게 지원하는 특별한 문장
◈ 구문형식
START WITH 조건1 .... CONNECT BY 조건2
- START WITH 조건1 : 역할
루트노드를 식별
조건1을 만족하는 모든 로우들은 루트노드가 됨
생략 시 모든 로우들을 루트노드로 간주
조건1에 서브쿼리도 가능
- CONNECT BY 조건2 : 역할
부모와 자식노드들 간의 관계를 명시
조건2에서는 반드시 PRIOR 연산자 포함 - 부모노드의 컬럼을 식별하는데 사용
조건2에는 서브쿼리는 불가능
2. START WITH ... CONNECT BY - 기본 테이블
◈ TEST_TABLE_ONE
IDX | NAME | ID | P_LEVEL | PP_LEVEL |
1 | 테스트1 | test1 | 1 |
|
2 | 테스트2 | test2 | 2 | 1 |
3 | 테스트3 | test3 | 3 | 1 |
4 | 테스트4 | test4 | 4 | 2 |
5 | 테스트5 | test5 | 5 | 2 |
3. START WITH ... CONNECT BY - SQL 문장
◈ SQL
1 2 3 4 | SELECT LPAD(' ' ,2*(LEVEL-1)) || NAME FROM TEST_TABLE_ONE START WITH PP_LEVEL IS NULL CONNECT BY PRIOR P_LEVEL=PP_LEVEL |
◈ 결과 테이블
LPAD('',2*(LEVEL-1)) || NAME |
테스트1 |
테스트2 |
테스트4 |
테스트5 |
테스트3 |
◈ 설명
결과를 보게 된다면 LEVEL 이라는 것은 가상의 컬럼으로 계층정보를 표현할 때 레벨을 나타냅니다
그래서 위와 같이 사용이 가능하고 루트노드가 1 그 자식노드가 2 자식 노드의 자식 노드가 3... 이런 식으로
사용 가능합니다