셀프 조인, 그리고 계층 쿼리

배쨈·2023년 9월 1일
0

SQL

목록 보기
9/9

SELF JOIN

말 그대로 나 자신과의 조인! FROM절에 같은 테이블이 두 번 이상 등장
-> 혼란 방지를 위해서 ALIAS 필수

SELECT A.TYPE , A.NAME, B.TYPE, B.NAME , C.TYPE, C.NAME
FROM table A, table B, table C
WHERE A.NAME = B.parentNAME
AND B.NAME = C.parentNAME ;


계층 쿼리

테이블에 셀프조인이 반복 되어 계층 구조를 이루는 컬럼이 존재할 경우 계층 쿼리를 이용하여 데이터 출력이 가능하다!

PRIOR가 부모 노드에 붙어있으면 역방향
PRIOR가 자식 노드에 붙어있으면 순방향

순방향 계층 쿼리 (루트 -> 리프)

SELECT LEVEL,
	SYS_CONNECT_BY_PATH (NAME, '--') AS path
    FROM table
   START WITH parentNAME IS NULL
   CONNECT BY PRIOR NAME = parentNAME ;
  • LEVEL : 현재의 DEPTH를 반환 루트 노드 = 1
  • SYS_CONNECT_BY_PATH(컬럼 , 구분자) : 루트 노드부터 현재 노드까지의 경로를 출력
  • START WITH : 경로가 시작되는 루트 노드를 생성
  • CONNECT BY : 루트로부터 자식 노드를 생성해준다. 조건에 만족하는 데이터가 없을 때까지 생성
  • CONNECT BY PRIOR 자식(하위) = 부모(상위) ;
    : 이전 LEVEL의 자식 컬럼 값이 , 현재 행의 부모 컬럼과 동일한 값이면 현재 행에서 이전 LEVEL의 +1을 세팅한다.

계층 쿼리 예시

PRIOR(이전)의 상위부서번호가 LEVEL값을 매기려하는 행의 부서번호와 같을 때, LEVEL 2를 setting한다.

  • START WITHLEVEL 1을 셋팅
  • 상위부서번호가 NULL인데, 부서번호가 NULL인 행이 없으므로 한 행만 출력 후 종료

역방향 계층 쿼리 (리프 -> 루트)

SELECT LEVEL,
	SYS_CONNECT_BY_PATH (NAME, '--')
    FROM table
   START WITH TYPE = 'bottom'
   CONNECT BY NAME = PRIOR parentNAME ;
  • START WITH TYPE을 하위 노드로 잡아준다.
  • CONNECT BY PRIOR 부모(상위) = 자식(하위) ;

계층쿼리의 정렬

ORDER SIBILING BY로 정렬, 같은 레벨끼리 정렬된다.

정렬전

정렬후

왜 똑같ㅌ냐

profile
빵상빵상

0개의 댓글