CONNECT BY LEVEL 질문 드립니다. 0 1 891

by 몽키매직 [Oracle 기초] [2020.07.30 11:17:29]


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개로우만 나오는데 여러개일때는 무슨 원리로 어떻게 동작해서 저렇게 나오는지 .. ;;

by 마농 [2020.07.30 12:42:42]

CONNECT BY LEVEL <= n 을 이용한 행복제 방식은 dual 과 같은 단일행 에만 적용해야 합니다.
다중행 적용시 기하급수로 늘어나게 되니. 절대로 이렇게 사용해서는 안됩니다.
http://www.gurubee.net/article/55635

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