CTE 계층형 쿼리 정렬 관련 0 4 144

by hun [SQL Query] CTE 재귀 계층형 [2019.11.08 16:17:32]


캡처.PNG (20,011Bytes)

안녕하세요.

CTE를 사용해서 계층형 쿼리를 만들고 있습니다.

계층형 쿼리에서 계층이 깨지지 않으면서 특정 값에 따라 정렬을 한 번 더해야하는 상황인데, 어떻게 해야될지 몰라서 질문드립니다.

특정 값에 따라 정렬을 할려고 하면 계층이 깨져서 문제입니다ㅠㅠ

WITH RECURSIVE cte AS(
    SELECT 1 AS lv
         , empno
         , ename
         , job
         , mgr
         , rank
         , CAST(empno AS char(99)) x
    FROM emp
    WHERE job = 'PRESIDENT'
    UNION ALL
    SELECT b.lv + 1 AS lv
         , p.empno
         , p.ename
         , p.job
         , p.mgr
         , p.rank
         , CONCAT(b.x, '-', p.empno) x
    FROM emp p
             INNER JOIN cte b
                        ON p.mgr = b.empno
)
SELECT *
FROM cte
ORDER BY x;

위의 쿼리 결과로 아래와 같은 결과가 도출되는데, ename이 BLAKE 아래에 있는 SALESMAN의 정렬을 RANK 값에 따라 재정렬하고 싶은데 어떻게 해야할까요?

귀한 시간 내주셔서 감사합니다ㅠㅠ

by 마농 [2019.11.08 16:23:44]

x 를 만들어 낼 때 empno 로 만들지 말고, rank 로 만들면 되죠.
단, rank 의 자리수가 1자리 고정이라면? 그대로 사용하면 되구요.
1자리 이상도 가능하다면? 최대자리수만큼 LPAD 로 채워서 만드셔야 합니다.
null 도 가능하다면 이부분도 다른 값으로 치환해줘야 하겠네요.
그리고, rank 등의 예약어를 컬럼명으로 사용하는 것은 좋지 않습니다.


by 마농 [2019.11.08 16:56:14]
WITH RECURSIVE cte AS
(
SELECT 1 AS lv
     , empno
     , ename
     , job
     , mgr
     , rk
     , CAST(CONCAT(IFNULL(rk, 0), empno) AS CHAR(99)) x
  FROM emp
 WHERE job = 'PRESIDENT'
 UNION ALL
SELECT b.lv + 1 AS lv
     , p.empno
     , p.ename
     , p.job
     , p.mgr
     , p.rk
     , CONCAT(b.x, '-', CONCAT(IFNULL(p.rk, 0), p.empno)) x
  FROM emp p
 INNER JOIN cte b
    ON p.mgr = b.empno
)
SELECT *
  FROM cte
 ORDER BY x
;

 


by hun [2019.11.13 16:14:32]

답변 감사합니다!

근데 남겨주신 답변 중 "1자리 이상도 가능하다면? 최대자리수만큼 LPAD 로 채워서 만드셔야 합니다." 부분이 이해가 가질 않습니다. 

예를들어 rk가 1~5가 아닌 1~10이라면 순서가 1,10,2,3,4,5,6,7,8,9,10 이런 경우일 때 LPAD를 사용해 최대 자리수 만큼 채워서 정렬할 수 있다는 뜻인 거 같은데, 잘 모르겠습니다.

해당 부분에 대해 설명해 주시면 감사하겠습니다!

친절하게 답변해 주셔서 감사합니다!!!


by 마농 [2019.11.13 16:54:06]

2 와 10 을 문자 정렬하면 10 이 먼저입니다.

따라서 자리수를 채워 02 와 10 으로 비교하여 02 가 먼저 나오도록 하는거죠.

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