oracle의 sys_connect_by_path, start with ~ connect by prior 를 mysql 로 변환 0 5 20,740

by 쏘쓰 [SQL Query] ORACLE MySQL sys_connect_by_path [2019.09.25 15:33:46]


안녕하세요. 

매번 염치없이 질문 드려 죄송하고 감사합니다.

oracle 의 sys_connect_by_path 와 start with ~ connect by prior 를 사용한 쿼리를 

mysql 로 변환 하려 하는데 어려움이 있어 질문 드립니다.

select
    id,  
    p_id,
    ltrim (sys_connect_by_path (name, ' > '), ' > ') as fullname
from table1
start with p_id = 1 connect by prior id = p_id

		      

위 와 같은 oracle 쿼리를 mysql 로 변환 할수 있는지 궁금합니다.

구글링 해서 나오는 함수를 이용하는 방법을 적용했을때

원하는 fullname 컬럼이 원하는 형태로 출력 되지 않아 어려움이 있습니다. 

조언이나 참고할 문서를 답변에 남겨 주시면 감사하겠습니다.

 

by jkson [2019.09.25 16:06:08]

재귀쿼리 되는 버전이면 재귀쿼리로 구현 가능하실 것 같습니다.


by 쏘쓰 [2019.09.25 16:41:31]

먼저 답변감사드립니다.

저의 경우 mysql 버전이 5.7.x 이며,

말씀하시는 재귀쿼리가 CTE를 말씀하시는 거라면 불가 할거 같습니다 ㅠㅠㅠㅠ

 


by 소주쵝오 [2019.09.25 16:53:34]
with recursive rec (id, p_id, fullname, lv) as
( select id, p_id, cast(name as char(50)), 1
  from table1
  where p_id = 1
  union all
  select t.id, t.p_id
       , concat(r.name, ' > ', t.name) 
       , lv + 1
  from table1 t, rec r
  where t.p_id = r.id
)
select *
from rec;

 


by 쏘쓰 [2019.09.25 17:41:28]

답변 감사드립니다!!

허나, 제 MySQL 버전이 5.7이라 재귀함수를 사용할 수 없습니다 ㅠㅠㅠ


by 마농 [2019.09.26 15:34:44]
-- 최대 가능 레벨까지 조인 추가 --
SELECT a.id
     , a.p_id
     , a.name
     , CONCAT_WS('>', e.name, d.name, c.name, b.name, a.name) fullname
  FROM table1 a
  LEFT OUTER JOIN table1 b ON a.p_id = b.id
  LEFT OUTER JOIN table1 c ON b.p_id = c.id
  LEFT OUTER JOIN table1 d ON c.p_id = d.id
  LEFT OUTER JOIN table1 e ON d.p_id = e.id
 WHERE a.p_id = 1
 ORDER BY fullname
;

 

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