Oracle은 CONNECT BY PRIOR, START WITH를 사용하여 편하게 계층형 쿼리를 조회할 수 있지만.. MySQL에는 그런거 없어서 직접 구현해줘야한다. 😫
계층형으로 되어있는 부서를 조회해보자 ❗️
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
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)의 하위 부서들이 전부 조회된다.