오라클 CONNECT BY PRIOR 사용한 구문을 WITH 구문으로 바꾸려고 할 때에 어려움이 있습니다. 0 2 2,365

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를 구할 수가 없게 되었습니다.
그래서 계속 고민하고 있는데 답이 나오지가 않네요ㅠㅠ 혹시 좋은 아이디어가 있을까요?

by 마농 [2024.01.23 09:01:59]
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
;

 


by 킨글 [2024.01.23 10:58:05]

헉... 이게되네요... 천재십니다! 역시 저의 무지함이었습니다.

감사합니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입