[SI] 프로젝트 13주차 ~ 16주차

소복치·2025년 2월 13일

앞선 13,14,15 주차 내용은 패스한다.

왜냐하면, 계열사들이 데이터를 제 시간에 주지않아 12개의 계열사에게 데이터를 받는 것에 집중하였고,
거기에 맞춰서 요구사항 정의서 및 테이블 정의서를 지속적으로 수정하며
모든 계열사들의 데이터들이 딱 떨어져맞는 코드를 계속해 수정해 나아가는 작업들을 해왔기 때문에
계속해서 작성하는 내용과 동일해 적지않았다.

이번16주차때는 드디어 "조.직.도" 제일 어려운것이 남았다.

1. 조직도 테이블 설계

위 그림과 같이 계층 구조를 이루고 있는 테이블 이기 때문에,
규칙을 정해 단순하게 코드 하나만 바꿔도 검색 할 수 있도록 하였다.

  1. 최상위 코드는 '000000' 으로 고정
  2. 최상위 코드는 무조건 '각 계열사 이름으로'

이렇게 정한뒤,

원천을 적재할 수 있는 테이블 -> 조직도 가공 테이블

이 순서대로 데이터가 들어갈 수 있도록 설계하고
원천에서 규칙을 적용하기 위해 가공 작업을 진행했다.

이렇게 작업하고 나면 계층형 쿼리 를 이용하여 확인하면된다.

2. 계층형 쿼리 란?

계층형 쿼리는 부모-자식 관계를 가지는 데이터를 조회할 때 사용되는 SQL 기법
주로 조직도, 카테고리, 제품 분류, 댓글 구조 등의 트리(Tree) 구조를 표현할 때 활용됨

계층형 쿼리의 주요 개념

  • 루트 노드(Root Node) → 최상위 부모
  • 자식 노드(Child Node) → 특정 부모 아래 있는 노드
  • 레벨(Level) → 계층 깊이를 나타냄

3. 계층형 쿼리 조회

SELECT LPAD(' ', LEVEL * 2) || NAME AS INDENTED_NAME, -- 계단 형식 들여쓰기
       ID,
       PARENT_ID,
       LEVEL  -- 계층 레벨 표시
FROM your_table
START WITH PARENT_ID IS NULL  -- 최상위 루트 노드 지정
CONNECT BY PRIOR ID = PARENT_ID -- 부모-자식 관계 설정
ORDER SIBLINGS BY ID; 

쿼리 설명

  1. LPAD(' ', LEVEL * 2) || NAME AS INDENTED_NAME

    • LPAD(' ', LEVEL * 2)을 사용하여 LEVEL 값에 따라 이름 앞에 공백을 추가하여 계단식 들여쓰` 기를 적용.
    • || NAME을 사용하여 NAME 컬럼과 연결.
  2. LEVEL 컬럼 포함

    • 데이터가 몇 번째 계층(level) 인지 표시.
  3. ORDER SIBLINGS BY

    • 같은 계층의 형제 노드를 정렬.
  4. START WITH PARENT_ID IS NULL

    • PARENT_ID가 NULL인 루트 노드를 찾음.
  5. CONNECT BY PRIOR ID = PARENT_ID

    • 부모-자식 관계를 설정.

profile
오늘 터져도내일 다시극복

0개의 댓글