CONNECT BY LEVEL < '숫자' 로 임의의 숫자갯수만큼 로우를 만들어주고 LEVEL값을 활용하여 수식도 할수있다는 정도는
알고있습니다. 근데 궁금한게 대부분 FROM DUAL 로 하는데 만약 데이터가 있는 테이블을 하는데 테이블 안에 로우가 한개가
아닌 여러개가 있다면 값이 규칙적으로 나오긴 하는데 왜 그렇게 나오는지 알고싶습니다.
WITH T AS (
SELECT 1 NO FROM DUAL UNION ALL
SELECT 2 NO FROM DUAL UNION ALL
SELECT 3 NO FROM DUAL UNION ALL
SELECT 4 NO FROM DUAL UNION ALL
SELECT 5 NO FROM DUAL UNION ALL
SELECT 6 NO FROM DUAL UNION ALL
SELECT 7 NO FROM DUAL )
SELECT NO, LEVEL FROM T
CONNECT BY LEVEL < 3
ORDER BY NO, LEVEL
이렇게 하면 왜 같은 NO가 8개씩 생기며 ( T 테이블의 로우는 7개인데 ) LEVEL은 왜 1만 1개이고 2만 7개인지...
LEVEL < 4로 하면 1은 1개 2는7개 동일하고 3은 49개 LEVEL마다 T테이블 로우만큼 곱하기 하는건가요. 왜1만 1개인지 ㅎㅎ;;
이 쿼리를 하다가 왜 저렇게 될까 궁금증이 들었거든요
SELECT REGEXP_SUBSTR(REGEXP_REPLACE(C, '\([0-9]\)+', '|'), '[^|]+',1,LEVEL), LEVEL
FROM (
WITH TMP AS (
SELECT '(1)그랜저,싼타페 (2)K9,스팅어,K3 (3)말리부' C FROM DUAL UNION ALL
SELECT '(1)G80(2)K5,모닝' FROM DUAL UNION ALL
SELECT '(1)소나타,아반떼,펠리세이트,GV80' FROM DUAL )
SELECT * FROM TMP )
CONNECT BY REGEXP_SUBSTR(C, '\([0-9]\)+', 1, LEVEL) IS NOT NULL
데이터가 저렇게 있을경우 차종만 빼오고 싶은데.. 이렇게 하고 GROUP BY 하면 차종만 나오긴 합니다
근데 왜 중복 데이터가 많이 나오는지 테이블에 로우가 많거나 REGEXP_SUBSTR에 해당하는 (숫자)가 많으면 쿼리 실행하다
그냥 행?이 걸립니다. DB CPU 100% 먹으면서 체크해서 세션 죽일수밖에 없거든요.
TMP 테이블에 로우가 하나일때는 딱 3개로우만 나오는데 여러개일때는 무슨 원리로 어떻게 동작해서 저렇게 나오는지 .. ;;
CONNECT BY LEVEL <= n 을 이용한 행복제 방식은 dual 과 같은 단일행 에만 적용해야 합니다.
다중행 적용시 기하급수로 늘어나게 되니. 절대로 이렇게 사용해서는 안됩니다.
http://www.gurubee.net/article/55635