마리아 DB 2 - RECURSIVE

|

https://www.mysqltutorial.org/mysql-recursive-cte/

WITH recursive CTE as( -- 재귀쿼리 세팅
    select 0 as HOUR -- 초기값 설정
    union all -- 위 쿼리와 아래 쿼리의 값을 연산
    select HOUR+1 from CTE -- 하나씩 불려 나감 
    where HOUR < 23 -- 반복을 멈추는 용도
)
<when test = 'subOrgYn == "Y"'>
    AND EMP.ORG_ID IN (
            WITH RECURSIVE TEMP AS -- TEMP라는 이름으로 재귀 쿼리 선언
            ( -- 재귀쿼리 시작
                SELECT 	ORG_ID
                FROM 	SSP_ORG
                WHERE 	UP_ORG_ID = #{orgId} -- 검색 성능을 높이기 위해 여기에 WHERE조건을 추가
                        OR		ORG_ID = #{orgId}
                        AND		COMPANY_SEQ = #{companySeq}
                UNION -- 반복 시작. UNION ALL 을 안할 경우 알아서 중복을 제거하고 찾아주나 성능이 저하됨.
                SELECT T.ORG_ID
                FROM	TEMP W
                        JOIN  SSP_ORG T
                        ON T.UP_ORG_ID = W.ORG_ID 
                -- 검색이 끝나면 먼저 찾은 구문에 해당 데이터를 추가
            ) -- 재귀 쿼리 종료
            SELECT ORG_ID FROM TEMP -- 재귀쿼리를 참조하여 SELECT
        )
</when>
-- 오라클의 START WITH, CONNECT BY PRIOR 대신 사용한다.
        WITH RECURSIVE LIST_MENU_ROLE  AS -- 해당 이름으로 재귀쿼리 선언 
        (
        -- 가장먼저 조회할 데이터 SELECT
            SELECT  CONVERT(TB_M.SORT USING latin1) AS ROOT_SORT  -- TB_M 문자열 변환하여 ROOT_SORT 란 이름으로 
                    , TB_M.*
                    , 1 AS LEVEL    -- LEVEL 항목 생성
            FROM    SFI_MENU TB_M
            WHERE   TB_M.PARENT_SEQ IS NULL  -- 부모가 없는 데이터 먼저 SELECT
            -- 검색 성능을 높히기 위해선 여기에 WHERE 문을 통해 조건을 추가한다.
            UNION ALL -- 반복 시작. ALL을 안할 경우 알아서 중복을 제거하고 찾아주나 성능이 저하됨
            SELECT    -- SELET 한다.
                    CONCAT_WS(',', LIST_MENU_ROLE.ROOT_SORT, TB_M.SORT) -- 문자열 합치기. ,를 구분자로 이후 항목을 합친다.
                    , TB_M.*
                    , 1+LEVEL AS LEVEL -- LEVEL 항목 자동 추가
            FROM    SFI_MENU TB_M
                    INNER JOIN LIST_MENU_ROLE
                    ON TB_M.PARENT_SEQ = LIST_MENU_ROLE.SEQ -- JOIN하여 부모의 고유값과 부모키가 같은 것만.
                    -- 검색 성능을 높히기 위해선 여기에 WHERE 문을 통해 조건을 추가한다.
                     
                    -- 검색이 끝나면 먼저 찾은 구문에 해당 데이터를 추가(?)한다.
        ) -- 재귀쿼리 종료
        SELECT -- 재귀쿼리를 참조하여 SELECT
                TB_M.SEQ                AS MENU_SEQ
                , TB_M.ID               AS MENU_ID
                , TB_M.MENU_TYPE_CD     AS MENU_TYPE_CD
                , F_SFI_CODE_NM('KO', 'CMM_MENU_TYPE_CD', TB_M.MENU_TYPE_CD) AS MENU_TYPE_NM
                , TB_M.NAME             AS MENU_NAME
                , TB_M.PARENT_SEQ        AS MENU_PARENT_SEQ
                , TB_M_PA.ID            AS MENU_PARENT_ID
                , TB_M_PA.NAME            AS MENU_PARENT_NAME
                , TB_M.URL              AS MENU_URL
                , TB_M.PARAMETER        AS MENU_PARAMETER
                , TB_M.DESCRIPTION      AS MENU_DESCRIPTION
                , TB_M.SORT             AS MENU_SORT
                , TB_M.USE_YN           AS MENU_USE_YN
                , LEVEL

 

                , CASE WHEN TB_MR.SEQ IS NULL THEN 'N' ELSE 'Y' END AS MENU_ROLE_YN -- oracle의 EDCODE 대신 사용
                , TB_MR.SEQ             AS MENU_ROLE_SEQ
                , TB_MR.ROLE_SEQ        AS ROLE_SEQ
        FROM       LIST_MENU_ROLE TB_M
                -- 그 외 조건.
                LEFT OUTER JOIN SFI_MENU_ROLE TB_MR
                ON TB_MR.MENU_SEQ = TB_M.SEQ        
                AND TB_MR.ROLE_SEQ = '10143'
                LEFT OUTER JOIN SFI_MENU TB_M_PA
                ON TB_M_PA.SEQ = TB_M.PARENT_SEQ
        WHERE      1=1
        AND     TB_M.USE_YN = 'Y'
        ORDER BY TB_M.ROOT_SORT;

'DATABASE(SQL)' 카테고리의 다른 글

이중화 (Replication)  (0) 2022.10.06
Oracle SID, Database Name, Service Name  (0) 2022.08.12
sequence 관련  (0) 2021.12.29
Dual 테이블이란?  (0) 2021.04.19
프로시저, 트랜잭션, 배치  (0) 2021.04.16
And