[ORACLE, SQL] 계층형 구조로 출력하기

Ga0·2023년 7월 7일
0

SQL

목록 보기
2/6

"SQL문 코드로 두 테이블의 데이터를 계층으로 뽑아 출력하는 것에 어려움이 있었고, 생소했어서 정리하고자 한다."

문제

  • 만약 CLASS 테이블에 수업 코드와 그의 상위 수업 코드, 수업 제목을 가지고 있다.
  • 또, STUDENT 테이블에는 수업을 듣는 학생아이디와 학생 이름을 가지고 있다고 하자.
  • 예를 들어 아래와 같이 출력하고자 한다.
  • 단, 수업코드, 사용자 이름으로 정렬한다.

SQL문 코드

-- 전체 상위 클래스의 CD값은 000이므로 CASE WHEN 문으로 공백을 0으로 설정한다.
-- 또, LEVEL별로 공백을 주어 계층형 구조로 만든다.
SELECT CASE WHEN CD = '000' THEN LPAD (' ', 0*LEVEL) || TXT
		ELSE LPAD(' ', 2*LEVEL) || TXT END AS 계층구조
 FROM ( SELECT  CLASS_CD AS CD	-- 수업 코드
			  , CLASS_UP_CD AS UP_CD -- 상위 수업 코두
              , CLASS_CD AS ORDERINGS -- 정렬 기준(수업 코드)
              , CLASS_CD || '[' || CLASS_NM || ']' AS TXT -- 출력하고자하는 형식으로 맞춤
		 FROM CLASS
	UNION ALL -- 행을 맞춰서 밑으로 합친다.(중복 허용)
        SELECT  STUDENT_ID AS CD -- 학생 아이디
			  , CLASS_CD AS UP_CD -- 수업 코드
              , STUDENT_NM AS ORDERINGS	-- 정렬 기준(학생 이름) 
              , STUDENT_ID || '[' || STUDENT_NM || ']' AS TXT -- 출력하고자하는 형식으로 맞춤
	     FROM STUDENT
 )
 START WITH CD = '000' -- 수업 코드가 00인 것을 시작으로 계층형을 만든다.
 -- 부서 기준이 되는 코드 부서 코드(CLASS_CD) 상위 부서 코드(CLASS_UP_CD) 하위 코드(STUDENT_ID)
 -- 사용자 기준이 되는 코드 학생아이디 코드(STUDENT_ID) 상위 부서 코드(CLASS_CD) 
 -- 기준을 잘 살펴보면 상위는 상위로 맞춰서 별칭(UP_CD)을 쓰고,
 -- 기준이 되는 코드는 CD라는 코드로 맞춘 별칭을 쓴다.
 CONNECT BY UP_CD = PRIOR CD 
 ORDER SIBLINGS BY ORDERINGS; -- 정렬이 되는 기준의 별칭으로 정렬한다.
 -- ORDER SIBLINGS BY :  계층내에서 정렬 할 수 있다. 

느낀 점

  • 다른 컬럼을 하나의 별칭으로 묶어서 연결하여 계층형 구조로 만든다는 것은 여태까지 경험해본적이 없어서 매우 신선했다.
  • 또, 정렬 기준도 다른 컬럼을 같은 별칭으로 엮어서 정렬을 수행했다.

0개의 댓글