계층 쿼리를 사용하면 순환 관계를 가진 데이터를 조회할 수 있다.

 

순환 관계를 가진 데이터는 아래와 같은 계층 구조로 표현할 수 있다.

박스로 표시된 부분을 노드(node)라고 한다.

순환 관계는 노드와 노드의 관계를 통해 만들어진다.

 

[계층 구조]

LEVEL = 1 - [root] - parent

LEVEL = 2 - [branch], [branch]

LEVEL = 3 - [branch], [leaf], [leaf], [leaf] - child

LEVEL = 4 - [leaf]

 

현재 노드는 부모 노드와 자식 노드를 가질 수 있다.

일반적으로 하나의 부모 노드는 다수의 자식 노드를 가질 수 있고,

하나의 자식 노드는 하나의 부모 노드만 가질 수 있다.

(이번 장에서 살펴볼 순환 관계는 1:M 관계를 가진다. M:M 순환 관계는 BOM(Bill Of Materials) 구조로 설계 된다. 이 책은 BOM 구조를 다루지 않는다.)

 

노드 - 설명

부모 노드 - 현재 노드의 직전 상위 노드

자식 노드 - 현재 노드의 직후 하위 노드

 

노드는 부모 노드와 자식 노드의 존재 여부에 따라 루트 노드, 브랜치 노드, 리프 노드로 구분할 수 있다.

 

노드 - 설명

루트 노드 - 부모 노드가 존재하지 않는 노드

브랜치 노드 - 부모 노드와 자식 노드가 존재하는 노드

리프 노드 - 자식 노드가 존재하지 않는 노드

 

순환 관계는 계층의 깊이에 따라 레벨(level)이 부여된다.

루트 노드는 레벨이 1이고 계층이 전개될수록 레벨이 증가한다.

 

emp 테이블의 empno 열과 mgr 열은 순환 관계를 가진다.

(emp 테이블의 루트 노드는 KING이다. 부모 노드가 없으므로 mgr 열이 널이다. 성능상의 이유로 널이 아닌 기본값을 저장하기도 한다.)

 

아래 쿼리에서 JONES의 부모 노드는 EMPNO가 JONES의 MGR인 KING, 자식 노드는 MGR이 JONES의 EMPNO인 SCOTT과 FORD다.

 

SELECT EMPNO, ENAME, MGR FROM EMP;

 

KING은 JONES, BREAK, CLARK을 자식 노드로 가지고, JONES는 SCOTT, FORD를 자식 노드로 가지며, SOCTT과 FORD는 각각 ADAMS와 SMITH를 자식 노드로 가진다.

 

순환 관계를 가진 테이블은 셀프 조인을 통해 부모 노드나 자식 노드를 조회할 수 있다.

 

아래 쿼리는 JONES의 자식 노드를 조회한다.

MGR이 JONES의 EMPNO인 행을 조회하면 된다.

 

SELECT B.EMPNO, B.ENAME, B.MGR

FROM EMP A, EMP B

WHERE A.ENAME = 'JONES' -- EMPNO = 7566

AND B.MGR = A.EMPNO;

 

아래 쿼리는 JONES의 자식 노드의 자식 노드를 조회한다.

MGR이 JONES의 자식 노드인 SCOTT과 FORD의 EMPNO인 행을 조회하면 된다.

 

SELECT C.EMPNO, C.ENAME, C.MGR

FROM EMP A, EMP B, EMP C

WHERE A.ENAME = 'JONES'

AND B.MGR = A.EMPNO

AND C.MGR = B.EMPNO;

 

아래 쿼리는 SMITH의 부모 노드를 조회한다.

EMPNO가 SMITH의 MGR인 행을 조회하면 된다.

 

SELECT B.EMPNO, B.ENAME, B.MGR

FROM EMP A, EMP B

WHERE A.ENAME = 'SMITH'

AND B.EMPNO = A.MGR;

 

아래 쿼리는 SMITH의 부모 노드의 부모 노드를 조회한다.

EMPNO가 SMITH의 부모 노드인 FORD의 MGR인 행을 조회하면 된다.

 

SELECT C.EMPNO, C.ENAME, C.MGR

FROM EMP A, EMP B, EMP C

WHERE A.ENAME = 'SMITH'

AND B.EMPNO = A.MGR

AND C.EMPNO = B.MGR;

 

깊은 레벨의 노드를 조회하기 위해서는 셀프 조인을 반복해야 한다.

오라클 데이터베이스는 순환 관계를 가진 데이터를 조회할 수 있는 계층 쿼리 절과 재귀 서브 쿼리 팩토링 기능을 제공한다.

 

불친절한 SQL 프로그래밍저자정희락출판디비안(DBian)발매2018.09.10.

 

 

+ Recent posts