[MySQL] 계층형 쿼리

개발자·2022년 1월 6일
0

DB

목록 보기
5/9
post-thumbnail
post-custom-banner

Oracle은 CONNECT BY PRIOR, START WITH를 사용하여 편하게 계층형 쿼리를 조회할 수 있지만.. MySQL에는 그런거 없어서 직접 구현해줘야한다. 😫

구현

계층형으로 되어있는 부서를 조회해보자 ❗️


DB

DEPT_TABLE

이름데이터 유형
DEPT_CD부서코드
DEPT_NM부서명
PARENT_DEPT_CD상위부서코드

프로시저

함수 생성 후 하단 코드를 작성해준다.
SF_GET_EMP_INC_CHILD

BEGIN
	DECLARE pParentDeptCd VARCHAR(50);
	DECLARE pDeptCd VARCHAR(50);
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET @DEPT_CD = NULL;
	
	SET pParentDeptCd = @DEPT_CD;
	SET pDeptCd = "0";
	
	IF @DEPT_CD IS NULL THEN
		RETURN NULL;
	END IF;
	
	LOOP
	
	SELECT MIN(DEPT_CD)
	INTO @DEPT_CD
	FROM DEPT_TABLE
	WHERE PARENT_DEPT_CD = pParentDeptCd AND DEPT_CD > pDeptCd;
		
	IF (@DEPT_CD IS NOT NULL) OR (pParentDeptCd = @START_WITH) THEN
		SET @LEVEL = @LEVEL+1;
	RETURN @DEPT_CD;
	END IF;
	
	SET @LEVEL := @LEVEL-1;
	
	SELECT DEPT_CD, PARENT_DEPT_CD
	INTO pDeptCd, pParentDeptCd
	FROM DEPT_TABLE
	WHERE DEPT_CD = pParentDeptCd;
	
	END LOOP;

END

Query

SELECT *
FROM (
	SELECT
		SF_GET_EMP_INC_CHILD() AS DEPT_CD
		, @LEVEL AS LEVEL
	FROM (
		SELECT
			@START_WITH:='dept_100' // 조회를 시작할 부서코드
			, @DEPT_CD:=@START_WITH
			, @LEVEL:=0
	) VARS
	JOIN DEPT_TABLE
	WHERE @DEPT_CD IS NOT NULL
) FNC 
INNER JOIN DEPT_TABLE D ON D.DEPT_CD = FNC.DEPT_CD

결과

부서코드를 규칙없이 넣어놓긴 했지만,, 개발팀(dept_100)의 하위 부서들이 전부 조회된다.



Ref

profile
log.info("공부 기록 블로9")
post-custom-banner

0개의 댓글