쿼리 질문 드립니다. 1 3 586

by 유경호 [SQL Query] [2021.04.01 11:37:02]


현재 로직에서 체크 용도로 사용 되고 있는 쿼리입니다.

SELECT REGEXP_SUBSTR(VAL, '[^,]+', 1, LEVEL) AS VAL1
FROM (
      SELECT REPLACE(T2.VAL, '^', ',') AS VAL
        FROM TABLE1 T1, TABLE1 T2
       WHERE T1.ID = '10002'
         AND T1.NAME = T2.NAME
         AND T1.ID = T2.ID
     )
CONNECT BY LEVEL <= REGEXP_COUNT(VAL, ',') + 1; 

서브 쿼리 정보는 아래와 같이 6 Row 데이터 결과가 리턴이 되고  LEVEL으로 하면은 무한 LOOP로 실행이 됩니다. ㅠㅠ

9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
9,10,11,12,13,14,15,16,17,18,19,20,21
9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
14,15,16,17,18,19,20,21,22,23,24
9,10,11,12,13,14,15,16,17,18,19,20,21,22
16,17,18,19,20,21,22
 

원하는 결과는 중복된 수자를 제외한 최종 결과를 구하고 싶습니다.

결과 : 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24

도움 부탁 드립니다.

 

by 마농 [2021.04.01 13:01:21]

Connect by Level <= n 를 이용한 행복제 방식은
반드시 dual 처럼 1건의 자료만 가지고 수행해야 합니다.
여러건의 자료에 직접 수행하면 원치 않는 기하급수로 늘어나는 결과를 초래하게 됩니다.
 

SELECT DISTINCT
       REGEXP_SUBSTR(val, '[^^]+', 1, lv) val1
  FROM (SELECT t2.val
          FROM table1 t1
             , table1 t2
         WHERE t1.id   = '10002'
           AND t1.name = t2.name
           AND t1.id   = t2.id
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 24)
 WHERE lv <= REGEXP_COUNT(val, '[^^]+')
 ORDER BY val1
;

 


by pajama [2021.04.01 13:21:40]

LISTAGG를 사용해봤습니다.

 

WITH T (VAL) AS (
SELECT '9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24' FROM DUAL UNION ALL
SELECT '9,10,11,12,13,14,15,16,17,18,19,20,21' FROM DUAL UNION ALL
SELECT '9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24' FROM DUAL UNION ALL
SELECT '14,15,16,17,18,19,20,21,22,23,24' FROM DUAL UNION ALL
SELECT '9,10,11,12,13,14,15,16,17,18,19,20,21,22' FROM DUAL UNION ALL
SELECT '16,17,18,19,20,21,22' FROM DUAL
)
SELECT LISTAGG(V1, ',')
         WITHIN GROUP (ORDER BY CAST (V1 AS INT))
FROM   (SELECT DISTINCT REGEXP_SUBSTR(VAL, '[^,]+', 1, LEVEL) V1
        FROM   (SELECT LISTAGG(VAL, ',')
                         WITHIN GROUP (ORDER BY VAL) VAL
                FROM   T)
CONNECT BY LEVEL <= REGEXP_COUNT(VAL, ',') + 1) 

 


by 유경호 [2021.04.02 08:55:30]

마농님 답변 너무 감사 드립니다.~

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