계층형 질의와 셀프 조인

song4·2023년 8월 8일
0

SQLD - SQL 활용

목록 보기
3/8
post-thumbnail

1. 계층형 질의

테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용한다.

계층형 데이터
동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터

예를 들어, 사원 테이블에서는 사원들 사이에 상위 사원(관리자)과 하위 사원 관계가 존재하고 조직 테이블에서는 조직들 사이에 상위 조직과 하위 조직 관계가 존재한다.

엔티티를 순환관계 데이터 모델로 설계할 경우 계층형 데이터가 발생한다.
순환관계 데이터 모델의 예로는 조직, 사원, 메뉴 등이 있다.
계층형 데이터

1) 사원에 대한 순환관계 데이터 모델을 표현한 것
2) 계층형 구조를 데이터로 표현한 것
3) 샘플 데이터

가. Oracle 계층형 질의

계층형 질의 구문

  • START WITH절은 계층 구조 전개의 시작 위치를 지정하는 구문이다. 즉, 루트 데이터를 지정한다.(액세스)
  • CONNECT BY절은 다음에 전개될 자식 데이터를 지정하는 구문이다. 자식 데이터는 CONNECT BY절에 주어진 조건을 만족해야 한다.(조인)
  • PRIOR : CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정한다. PRIOR 자식 = 부모 형태를 사용하면 계층구조에서 자식 데이터에서 부모 데이터(자식 → 부모) 방향으로 전개하는 순방향 전개를 한다. 그리고 PRIOR 부모 = 자식 형태를 사용하면 반대로 부모 데이터에서 자식 데이터(부모 → 자식) 방향으로 전개하는 역방향 전개를 한다.
  • NOCYCLE : 데이터를 전개하면서 이미 나타났던 동일한 데이터가 전개 중에 다시 나타난다면 이것을 가리켜 사이클(Cycle)이 형성되었다라고 말한다. 사이클이 발생한 데이터는 런타임 오류가 발생한다. 그렇지만 NOCYCLE를 추가하면 사이클이 발생한 이후의 데이터는 전개하지 않는다.
  • ORDER SIBLINGS BY : 형제 노드(동일 LEVEL) 사이에서 정렬을 수행한다.
  • WHERE : 모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출한다.(필터링)

Oracle은 계층형 질의를 사용할 때 다음과 같은 가상 칼럼(Pseudo Column)을 제공한다.
계층형 질의에서 사용되는 가상 칼럼

SELECT
    LEVET,
    사원,
    관리자,
    CONNECT_BY_ISLEAF ISLEAF
FROM 사원 
START WITH 관리자 IS NULL
CONNECT BY PRIOR 사원 = 관리자;
  • A는 루트 데이터이기 때문에 레벨이 1이다.
  • A의 하위 데이터인 B, C는 레벨이 2이다.
  • C의 하위 데이터인 D, E는 레벨이 3이다.
  • 리프 데이터는 B, D, E이다.
  • 관리자 -> 사원 방향의 전개이기 때문에 순방향 전개이다.

순방향 계층형 질의 결과의 논리적인 모습

SELECT
	LEVET,
    사원,
    관리자,
    CONNECT_BY_ISLEAF ISLEAF
FROM 사원
START WITH 사원 = 'D'
CONNECT BY PRIOR 관리자 = 사원;
  • D는 루트 데이터이기 때문에 레벨이 1이다.
  • D의 상위 데이터인 C는 레벨이 2이다.
  • C의 상위 데이터인 A는 레벨이 3이다.
  • 리프 데이터는 A이다.
  • 역방향 전개이기 때문에 하위 데이터에서 상위 데이터로 전개이다.

역방향 계층형 질의 결과의 논리적인 모습계층형 질의에서 사용되는 함수

-- SYS_CONNECT_BY_PATH, CONNECT_BY_ROOT를 사용하는 예
SELECT 
	CONNECT_BY_ROOT 사원 루트사원,
    SYS_CONNECT_BY_PATH(사원, '/') 경로,
    사원,
    관리자
FROM 사원
START WITH 관리자 IS NULL
CONNECT BY PRIOR 사원 = 관리자;

START WITH를 통해 추출된 루트 데이터가 1건 이기 때문에 루트사원은 모두 A이다.
경로는 루트로부터 현재 데이터까지의 경로를 표시한다.

나. SQL Server 계층형 질의

이해가 어려워 작성이 힘들다....

2. 셀프 조인

셀프 조인(Self Join)이란 동일 테이블 사이의 조인을 말한다. 따라서 FROM 절에 동일 테이블이 두 번 이상 나타난다.

동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 식별을 위해 반드시 테이블 별칭(Alias)를 사용해야 한다.

SELECT
	ALIAS1.COLUMN1,
    ALIAS2.COLUMN2,
    …
FROM
	TABLE ALIAS1,
    TABLE ALIAS2
WHERE ALIAS1.COLUMN2 = ALIAS2.COLUMN1;

계층형 질의에서 살펴보았던 사원이라는 테이블 속에는 사원과 관리자가 모두 하나의 사원이라는 개념으로 동일시하여 같이 입력되어 있다.
셀프 조인 개념

셀프 조인은 동일한 테이블(사원)이지만 개념적으로는 두 개의 서로 다른 테이블(사원, 관리자)을 사용하는 것과 동일하다.

SELECT
    E1.사원,
    E1.관리자,
    E2.관리자 차상위_관리자
FROM
	사원 E1,
    사원 E2
WHERE E1.관리자 = E2.사원;
ORDER BY E1.사원;

자신과 자신의 직속 관리자는 동일한 행에서 데이터를 구할 수 있으나
차상위 관리자는 바로 구할 수 없다.

차상위 관리자를 구하기 위해서는 자신의 직속 관리자를 기준으로 사원 테이블과 한번 더 조인(셀프 조인)을 수행해야 한다.

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

즐겁게 읽었습니다. 유용한 정보 감사합니다.

답글 달기

관련 채용 정보