-
계층형 쿼리 (Hierarchiacal Query)SQL 2020. 2. 18. 08:36
계층형 쿼리 (Hierarchiacal Query)
1) 상향식 : 최상위 노드에서 시작하여 하위 노드로 내려가는 계층 쿼리
2) 하향식 : 전체 노드를 방문하는게 아니라 자신의 부모노드만 방문
- 오라클에서만 지원하고 있는 막강한 기능 중 하나
- 관계형이라는 의미가 서로 평등하고 수평적인 관계를 의미하는 반면 계층형 구조는 이와는 다르게
평등한 관계가 아닌 계급적이고 수직적인 관계를 가진다.
한마디로 말해서 관계형이 평면적이라고 한다면 계층형은 수직적 구조라고 할 수 있다.
ex) 사회적인 의미의 계급구조
소프트웨어 관점에서 보면 웹 사이트의 답변형 게시판이나 BOM(Bill Of Material) 등
* BOM : 하나의 완제품이 만들어지는데 필요한 구성품목들의 내역 혹은 조합도
- 용어 정리
1) 노드 : 원모양으로 표시된 항목
각각의 품목이 하나의 노드가 되며 실제 테이블에서는 하나의 ROW에 대응된다.
2) 부모 : 부모노드라고도 한다. 트리구조에서 상위에 있는 노드를 말한다.
3) 자식 : 자식노드라고도 한다. 위 그림에서 모니터는 컴퓨터의 자식노드이며, 컴퓨터는 모니터와 본체의
부모노드라고 한다.
4) 리프 : 리프노드라고 한다. 더 이상 하위에 연결된 노드가 없는 항목을 말한다.
즉 자식 노드가 없는 노드
5) 루트 : 계층형 트리구조에서 최상위에 있는 노드
6) 레벨 : 트리구조에서의 각각의 계층
루트에 해당되는 컴퓨터가 1레벨이 되며 그 하위에 있는 모니터, 본체등이 2레벨
STNTAXS
SELECT ...
FROM ...
START WITH 조건1
CONNECT BY PRIOR 조건2
-> START WITH 절에 루트노드를 지정
- 루트 노드를 식별, 조건 1을 만족하는 모든 ROW들은 루트 노드가 된다.
- START WITH절 생략가능, 이러한 경우 모든 ROW들을 루트노드로 간주
- 서브쿼리도 사용가능
-> CONNECT BY 절에 부모노드와 자식 노드들간의 관계를 연결
- PRIOR가 붙은 컬럼이 루트노드
* LPAD( 값 , 총문자길이, 채움문자 )
- 왼쪽부터 총문자길이 -값의 길이만큼 채움문자를 넣어준다.
* RPAD( 값 , 총문자길이, 채움문자 )
- 오른쪽부터 총문자길이 -값의 길이만큼 채움문자를 넣어준다.
계층형 쿼리의 행 제한 조건 기술 위치에 따른 결과 비교 (Pruning Branch - 가지치기)
FROM => START WITH
CONNECT BY => WHERE
1. WHERE : 계층 연결을 하고 나서 행을 제한
2. CONNCET BY : 계층 연결을 하는 과정에서 행을 제한하고 계층 연결
WHERE절 기술 전
WHERE절 기술후
-> 계층 연결후 org_cd ='정보기획부' 인 한개의 ROW만 제외함
CONNECT BY 절에 조건 기술
-> 계층 연결하는 과정에서 org_cd='정보기획부' 인 ROW가 제한됨에 따라
정보기획부의 모든 자식노드들이 조회가 안됌
계층 쿼리 특수함수
종류
1. CONNCET BY_ROOT (컬럼)
- 최상위 데이터의 컬럼 정보 조회
2. SYS_CONNECT_BY_PATH(컬럼,'구분자')
- 계층 순회 경로 표현, 두번째 인자(경로 표현 구분자)
3. CONNECT_BY_ISLEAF ISLEAF : 현재 행이 마지막 LEAF 노드인지 리턴
1 -> 리프노드, 0 -> 리프노드 아님
설명
1. CONNECT BY ROOT (컬럼) : 해당 컬럼의 최상위 행의 값을 리턴
2. SYS_CONNECT_BY_PATH (컬럼, 구분자) : 해당 행의 컬럼이 거쳐온 컬럼 값을 추적, 구분자로 이어줌
* LTRIM(해당값, '구분자') : 구분자에 해당하는 값을 왼쪽에서 하나 없애라~
3. CONNECT_BY_ISLEAF : 해당 행의 LEAF 노드인지 확인
특수 계층 함수를 이용한 실습
게시판 글 순서
사용할 테이블
ROOT NODE : 답글이 아닌 첫번째 글, 두번째 글, 네번 째 글
START WITH 조건 : PARENT_SEQ가 NULL
CONNECT BY 조건 PRIOR SEQ = PARENT_SEQ
* ORDER SIBLINGS BY 컬럼; -> 계층구조를 유지한채로 정렬
-----> 답글의 순서가 뒤죽박죽인데 이 순서를 맞춰라!!
1. SEQ로만 정렬하면 루트노드 밑의 노드들의 순서를 원하는대로 정렬할 수 없기 때문에
그룹번호 칼럼을 UPDATE
2. 그룹번호 칼럼은 자신들의 ROOT노드의 SEQ값을 받아옴
추가한 그룹번호 칼럼을 이용하여 재정렬
'SQL' 카테고리의 다른 글
효율적인 쿼리 검색!!!!! (1) 2020.02.20 계층 쿼리 누적 합 구하기 (1) 2020.02.20 달력 쿼리 (0) 2020.02.17 WITH절 (0) 2020.02.17 서브쿼리 UPDATE (0) 2020.02.14