2008. 12. 8. 22:51
http://radiocom.kunsan.ac.kr/lecture/oracle/statement_select/hierarchical_query.html
계층적 질의(hierarchical query)
관계형 데이터베이스는 2차원 테이블 구조에 의해 모든 데이터를 저장한다.
하지만, 실무에서는 기업의 조직도, 집안의 족보처럼 계층적인 데이터 구조를 많이 사용하고 있다.
따라서 평면적인 구조를 가지는 테이블에서도 계층적인 데이터를 저장하여 조회할 수 있는 방법이 필요하다.
테이블에서 기업의 조직도와 같은 계층적인 데이터 자체를 저장하기는 어렵다. 하지만, 관계형 데이터베이스에서도 데이터간의 부모-자식 관계를 표현할 수 있는 컬럼을 지정하여 계층적인 관계를 표현할 수 있다.
하나의 테이블에서 계층적인 구조를 표현하는 관계를 순환관계(recursive relationship)라고 한다.
예를 들어, 부서 테이블에서 학과, 학부, 단과대학간의 계층적인 관계를 저장하는 컬럼을 지정하여 부서 번호간의 계층적인 관계를 표현할 수 있다.
즉, 이 컬럼에는 학과의 부모는 학부, 학부의 부모는 단과대학 번호를 저장하여 계층적인 관계를 표현할 수 있다.
오라클에서는 계층적인 데이터를 저장한 컬럼으로부터 데이터를 검색하여 계층적으로 출력할 수 있는 기능을 제공한다.
SELECT 문에서 START WITH와 CONNECT BY 절을 이용하여 데이터를 계층적인 형태로 출력할 수 있다.
계층적 질의문에서는 계층적인 출력 형식과 시작 위치를 제어할 수 있다. 계층적인 출력 형식은 top-down 또는 bottom-up 형식이 가능하다.
하지만 계층적 질의문은 조인문이나 뷰에서는 사용할 수 없으며, CONNECT BY 절에서는 서브쿼리 절을 포함할 수 없다.
【형식】 SELECT [LEVEL] {*,컬럼명 [alias],...} FROM 테이블명 WHERE 조건 START WITH 조건 CONNECT BY [PRIOR 컬럼1명 비교연산자 컬럼2명] 또는 [컬럼1명 비교연산자 PRIOR 컬럼2명]【계층구조의 출력형태】
1) top-down 출력형식 : 루트 로드부터 먼저 출력 CONNECT BY PRIOR column1 = column2 column1 = 자식 키 column2 = 부모 키 예) CONNECT BY PRIOR deptno = college | 2) bottom-up 출력형식 : 단말 로드부터 먼저 출력 CONNECT BY PRIOR column1 = column2 column1 = 부모 키 column2 = 자식 키 예) CONNECT BY PRIOR college = deptno |
START WITH 절 | 계층적인 출력 형식을 표현하기 위한 최상위 행 |
CONNECT BY 절 | 계층관계의 데이터를 지정하는 컬럼 |
PRIOR 연산자 | CONNECT BY는 PRIOR 연산자와 함께 사용하여 부모 행을 확인할 수 있다. PIOR 연산자의 위치에 따라 top-down 방식인지 bottom up 방식인지를 결정한다. PRIOR 연산자가 붙은 쪽의 컬럼이 부모 행이 된다. |
WHERE 절 | where 절이 JOIN을 포함하고 있을 경우 CONNECT BY 절을 처리하기 전에 JOIN 조건부를 적용하여 처리하고, JOIN을 포함하고 있지 않을 경우 CONNECT BY 절을 처리한 후에 WHERE 절의 조건을 처리한다. |
LEVEL | 계층적 질의문에서 검색된 결과에 대해 계층별로 레벨 번호 표시, 루트 노드는 1, 하위 레벨로 갈 수록 1씩 증가 |
'ORACLE' 카테고리의 다른 글
오라클 세션 조회 (0) | 2009.06.11 |
---|---|
merge이용 (0) | 2009.06.01 |
grouping sets 사용법 (0) | 2008.12.08 |
파티션 테이블 삭제하기. (0) | 2008.11.13 |
plan_table (0) | 2008.11.06 |