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 |