[mariadb] WITH 재귀쿼리 계층구조(조직도)

2024. 2. 15. 12:24·Database
반응형

WITH RECURSIVE CTE AS (
         SELECT DEPT_ID,
         DEPT_NAME,
         UP_DEPT_ID,
         DEPT_LOC,
         DEPT_SORT_ORDR,
         DEPT_STATUS,              
         DEPT_DEPTH,
         TOP_DEPT_YN, 
         1 AS LEVEL            
        FROM ORG_DEPARTMENT
        UNION ALL
         SELECT  A.DEPT_ID,
          A.DEPT_NAME,
          A.UP_DEPT_ID,
          A.DEPT_LOC,
          A.DEPT_SORT_ORDR,
          A.DEPT_STATUS,              
          A.DEPT_DEPTH,
          A.TOP_DEPT_YN,
          1 + B.LEVEL AS LEVEL
        FROM ORG_DEPARTMENT A
        INNER JOIN CTE B ON A.UP_DEPT_ID = B.DEPT_ID
)
SELECT DISTINCT 
        FUNC_DEPT_LOC_NAME(DEPT_ID,'ko'),
        DEPT_ID,
         DEPT_NAME,
         UP_DEPT_ID,
         DEPT_LOC,
         DEPT_SORT_ORDR,
         DEPT_STATUS,              
         DEPT_DEPTH,
         TOP_DEPT_YN 
FROM CTE
WHERE DEPT_STATUS ='U'
AND FUNC_DEPT_LOC_NAME(DEPT_ID,'ko') NOT REGEXP 'ESG|TFT|안전보건|운영지원|조사역|헬스키퍼'
ORDER BY  FUNC_DEPT_LOC_NAME(DEPT_ID,'ko') ASC, DEPT_SORT_ORDR ASC

 

 

===========================================================================

 

#DROP FUNCTION IF EXISTS FUNC_DEPT_LOC_NAME;
CREATE FUNCTION `FUNC_DEPT_LOC_NAME`(deptId VARCHAR(30), locale VARCHAR(2)) RETURNS varchar(4000) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
BEGIN
DECLARE flag         CHAR(1);
DECLARE endIdx       INT;
DECLARE tmpPathName  VARCHAR(100);
DECLARE pathName     VARCHAR(4000);
DECLARE deptLoc      VARCHAR(4000);

SET flag     = 'Y';
SET pathName = '';

SELECT CONCAT(DEPT_LOC,'/')
INTO deptLoc
FROM ORG_DEPARTMENT
WHERE DEPT_ID = deptId;

IF deptLoc IS NOT NULL THEN
loop1: WHILE flag = 'Y' DO
SET endIdx = LOCATE('/',deptLoc);

IF endIdx = 0 THEN
LEAVE loop1;
END IF;

SELECT FUNC_I18N(DEPT_ID, LOCALE, 'DEPT_NAME')
INTO tmpPathName
FROM ORG_DEPARTMENT
WHERE DEPT_ID = SUBSTR(deptLoc, 1, endIdx-1);

SET deptLoc = SUBSTR(deptLoc,endIdx+1);
SET pathName = CONCAT(pathName,tmpPathName,'>');
SET tmpPathName = NULL;
END WHILE loop1;

SET pathName = SUBSTR(pathName,1,CHAR_LENGTH(pathName)-1);
END IF;

RETURN pathName;
END;

반응형
저작자표시 비영리 (새창열림)

'Database' 카테고리의 다른 글

[MSSQL]매월 3째주 금요일 구하기(쿼리검증필요/주차관련)  (0) 2024.04.09
Elastic Search  (0) 2024.02.15
[MYSQL]초단위 -> 일시분초  (0) 2023.04.14
[MYSQL]ORDER BY VARCHAR타입 형변환(문자 -> 숫자)  (0) 2023.04.07
[MSSQL]DB연결(여러개)  (0) 2022.09.13
'Database' 카테고리의 다른 글
  • [MSSQL]매월 3째주 금요일 구하기(쿼리검증필요/주차관련)
  • Elastic Search
  • [MYSQL]초단위 -> 일시분초
  • [MYSQL]ORDER BY VARCHAR타입 형변환(문자 -> 숫자)
애플자라
애플자라
    반응형
  • 애플자라
    애플자라
    애플자라
  • 전체
    오늘
    어제
    • 분류 전체보기 (659)
      • ChatGPT (2)
      • Linux (93)
      • Programing (92)
      • Flex, Laszlo (15)
      • Database (168)
      • Network (15)
      • Data (14)
      • Tips (120)
      • 여행★ (1)
      • Board (116)
      • 맛집탐방 (3)
      • 아이원츄 (12)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • Love&Smile
    • Husk's repository
    • StartUp
    • DSDSTUDIO Experimentals
    • 신선
    • DEV.SEULKI.KR[이슬기]
    • Live Bit Block
  • 공지사항

  • 인기 글

  • 태그

    java
    IP
    오라클
    sql
    서버
    delete
    server
    윈도우
    파일
    자동차
    mssql
    Shell
    Excel
    Windows
    설정
    테이블
    DB
    select
    apache
    tomcat
    DATABASE
    백업
    Toad
    데이터
    리눅스
    eclipse
    Linux
    table
    Oracle
    MySQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
애플자라
[mariadb] WITH 재귀쿼리 계층구조(조직도)
상단으로

티스토리툴바