by 킨글 [SQL Query] CONNECT BY PRIOR WITH [2024.01.22 17:50:08]
안녕하세요, ORACLE에서 해당 쿼리를 통해서 ACCT_CD 가장 아래에서 UP_ACCT_CD 가장 위까지 재귀를 통해서 진행하여 가장 상단의 UP_ACCT_CD를 구하도록 만들었는데요.
아래와 같이 각각의 ACCT_CD가 있을 때에 가장 최상의 UP_ACCT_CD를 구했습니다.
ACCT_CD 1 위에 2가있고 ACCT_CD 2 위에 1000이 있는 구조입니다. (1 -> 2-> 1000)
ACCT_CD | UP_ACCT_CD
1 | 1000
2 | 1000
SELECT
SUB.ACCT_CD,
(
SELECT MAX(UP_ACCT_CD)
FROM TABLE MST
WHERE CONNECT_BY_ISLEAF = '1' <!-- 재귀에서 최상위 값만 가져옴 -->
START WITH 1 = 1
AND MST.ACCT_CD = SUB.ACCT_CD
CONNECT BY PRIOR UP_ACCT_CD = ACCT_CD
) AS ACGRP_CD
FROM SUB_TABLE SUB
근데 MARIADB로 하려고 하니 문제가 생겼습니다.
CONNECT BY PRIOR에서 WHERE CONNECT_BY_ISLEAF = '1'을 활용해서 가장 높은 UP_ACCT_CD를 구했었는데.. MARIADB에서는 해당 부분을 지원하지 않았습니다.
그래서 WITH 절로 바꾸려고 하니 WITH 절은 파라미터가 제공되지 않아 ACCT_CD 각각의 바로 위에 UP_ACCT_CD는 구할 수 있는데, 가장 높은 UP_ACCT_CD를 구할 수가 없게 되었습니다.
그래서 계속 고민하고 있는데 답이 나오지가 않네요ㅠㅠ 혹시 좋은 아이디어가 있을까요?
WITH RECURSIVE t2 AS ( WITH t1 AS ( SELECT 1 acct_cd, 2 up_acct_cd UNION ALL SELECT 2, 1000 UNION ALL SELECT 3, 2000 ) SELECT a.acct_cd , a.up_acct_cd , a.up_acct_cd acgrp_cd , 1 lv FROM t1 a LEFT OUTER JOIN t1 b ON a.up_acct_cd = b.acct_cd WHERE b.acct_cd IS NULL UNION ALL SELECT b.acct_cd , b.up_acct_cd , a.acgrp_cd , a.lv + 1 lv FROM t2 a INNER JOIN t1 b ON a.acct_cd = b.up_acct_cd ) SELECT * FROM t2 ;