현재 로직에서 체크 용도로 사용 되고 있는 쿼리입니다.
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
도움 부탁 드립니다.
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 ;
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)