MySQL 에서 start with.... connect by 쿼리를 구현하고 싶습니다. 0 4 2,963

by 버드나무 [MySQL] MySQL start with 오라클 쿼리변경 [2020.05.25 16:59:55]


202005251650.csv (34,689Bytes)

안녕하세요.

쿼리 바꾸는게 너무 힘이 들어서 부탁하러 왔습니다.

에효~ 도와주세요;;;

파일첨부에 파일은 sub쿼리 안에있는걸 mysql에서 돌린값입니다.

아래에 오라클쿼리 확인하시고 mysql쿼리로 바꿔주시면 대단히 감사하겠습니다.

시간이 걸리시겠지만 제발좀;;;

첨부파일은 엑셀에서 보실수 있습니다.

현재 쿼리----------------------------------------

 

SELECT   
             A.MENU_ID              
    ,        A.HIGH_MENU_ID        
    ,        A.PROGRAM_YN
    ,        A.POPUP_YN
    ,        A.LANGUAGE_CD
    ,        A.DISPLAY_NM
    ,        A.DISPLAY_ORDER
    ,        A.NODE_DEPTH
    ,        A.CONT
    ,        A.PROGRAM_PATH
    ,        A.DISPLAY_YN
    ,        A.ORI_MENU_ID
    ,        (SELECT COUNT(*) FROM F_MENU X WHERE X.PRISM_ID = A.PRISM_ID AND X.SYSTEM_DIV = A.SYSTEM_DIV AND X.HIGH_MENU_ID=A.MENU_ID)AS CHILD_CNT
    ,        CASE WHEN A.PROGRAM_YN = 'N' THEN 0 WHEN A.PROGRAM_YN = 'Y' AND A.POPUP_YN = 'N' THEN 1 ELSE 2 END AS ICON_NO
    FROM 
    (
             SELECT 
                        MENU_ID              
             ,          HIGH_MENU_ID
             ,          PROGRAM_YN
             ,          POPUP_YN
             ,          'KR' AS LANGUAGE_CD
             ,          (SELECT DISPLAY_NM FROM F_MENU_DISPLAY WHERE PRISM_ID = A.PRISM_ID AND SYSTEM_DIV = A.SYSTEM_DIV AND MENU_ID = A.MENU_ID AND LANGUAGE_CD = 'KR') AS DISPLAY_NM
             ,          DISPLAY_ORDER
             ,          NODE_DEPTH
             ,          CONT
             ,          PROGRAM_PATH
             ,          DISPLAY_YN
             ,          MENU_ID AS ORI_MENU_ID
             ,          PRISM_ID
             ,          SYSTEM_DIV
             FROM       F_MENU A
             WHERE      A.PRISM_ID   = 'AML'
             AND        A.SYSTEM_DIV = 'WMPPG'
    ) A
    START WITH A.NODE_DEPTH = '1'
    CONNECT BY PRIOR  A.MENU_ID = A.HIGH_MENU_ID
    ORDER SIBLINGS BY A.DISPLAY_ORDER

 

--------------------------------------------------

by 마농 [2020.05.25 17:55:52]
WITH RECURSIVE t AS
(
SELECT a.prism_id  
     , a.system_div
     , a.menu_id
     , a.high_menu_id
     , a.program_yn
     , a.popup_yn
     , a.display_order
     , a.node_depth
     , a.cont
     , a.program_path
     , a.display_yn
     , CAST(LPAD(IFNULL(a.display_order, 0), 2, '0') AS VARCHAR(100)) AS v_ord
  FROM f_menu a
 WHERE a.prism_id    = 'AML'
   AND a.system_div  = 'WMPPG'
   AND a.node_depth  = '1'
 UNION ALL 
SELECT a.prism_id  
     , a.system_div
     , a.menu_id
     , a.high_menu_id
     , a.program_yn
     , a.popup_yn
     , a.display_order
     , a.node_depth
     , a.cont
     , a.program_path
     , a.display_yn
     , CONCAT(b.v_ord, LPAD(IFNULL(a.display_order, 0), 2, '0')) AS v_ord
  FROM f_menu a
 INNER JOIN t b
    ON a.prism_id     = b.prism_id
   AND a.system_div   = b.system_div
   AND a.high_menu_id = b.menu_id
)
SELECT *
  FROM t
 ORDER BY v_ord
;

 


by 버드나무 [2020.05.25 18:19:11]

신경써주셔서 대단히 감사합니다.

그런데 왠일인지 오류가 나서....

혼자 분석해서 하려고 해도 이해를 못해서 고수님들 붙들고 부탁드리는 수밖에 없네요;;;

모쪼록 꾸벅꾸벅;;; 부탁드립니다.

, CAST(LPAD(IFNULL(a.display_order, 0), 2, '0') AS VARCHAR(100)) AS v_ord << 이부분에서 오류납니다.

오류내용---------------------

SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR(100)) AS v_ord
  FROM f_menu a
 WHERE a.prism_id    = 'AML'
   AND a.' at line 15

-----------------------------------------------

 

해당 라인과 union all 아래에 동일한 라인 지우고 테스트해봤는데 그래도 오류납니다.

오류내용-----------------------------

SQL Error [1054] [42S22]: Unknown column 'a.ori_menu_id' in 'field list'

-----------------------------

 


by 마농 [2020.05.25 18:40:32]

a.ori_menu_id 는 잘못된 부분이라 지웠습니다.
recursive 쿼리가 지원되는 버전인지 확인해 보세요.
8.0 이상 정도 되야 할 것 같습니다.


by 버드나무 [2020.05.26 10:36:31]

여기저기 짜맞춰서 겨우 해결 했습니다.

정말 감사합니다.

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