row 나열하기 질문드립니다. 0 4 910

by h2wshot [SQL Query] [2017.10.23 15:21:34]


a 3

b 1

c 5

 

로 되어있는 테이블을

a

a

a

b

c

c

c

c

c

 

방식으로 row를 늘리고 싶습니다.

connect by level의 개념이 잘 안잡히내요..해보니 예상보다 훨~~~씬 많은 row을 출력합니다.

 

by 우리집아찌 [2017.10.23 15:25:01]
WITH T ( val , cnt ) AS (
SELECT 'a' ,  3 FROM DUAL UNION ALL
SELECT 'b' ,  1 FROM DUAL UNION ALL
SELECT 'c' ,  5 FROM DUAL 
) , COPY_T AS (
SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= (SELECT MAX(CNT) FROM T ) 
)

SELECT A.VAL
  FROM T A, COPY_T B
 WHERE A.CNT >= B.LV
 ORDER BY val
 
 
 

 


by h2wshot [2017.10.23 15:31:47]

해결 뿐만 아니라 with 절끼리 뷰 내이서 참조되는 것도 더 잘 알게되었네요. 감사합니다.


by 랑에1 [2017.10.23 15:46:20]
WITH T(x, y) AS(
SELECT 'a', 3 FROM dual UNION ALL
SELECT 'b', 1 FROM dual UNION ALL 
SELECT 'c', 5 FROM dual
) 

SELECT x
FROM T, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 100) T2
WHERE lv <= y
ORDER BY x

 


by jkson [2017.10.23 16:17:02]

예상보다 훨~~~씬 많은 row를 출력한다면 connect by level 을 원 테이블에 바로 적용하신 것 같네요.

connect by level을 좀 쉽게 풀어보면요

select 'lv1' from t -- level = 1

union all

select 'lv2' from t, t -- level = 2

union all

select 'lv3' from t, t, t -- level = 3

...

이런 식으로 이해하시면 됩니다.

원 테이블 row 수가 2 개라면

2 개(level 1) + 4개(level 2) + 8개(level 3) + 16개(level 4)..

이런 식으로 자기 행복제를 해나가게 되는 겁니다.

원 테이블 row 수가 2일 때 4 level까지 가면 총 row 수는 30개가 되겠죠.

원 테이블 행수가 2개라도 이런데 만약 원테이블 row 수가 수만개라면??

쿼리 돌리면 재수 없으면 메모리 다 먹고 자폭할지도 모릅니다ㅎㅎ

그래서 원테이블에 connect by level 은 사용할 일이 거의 없고요

대부분 dual과 함께 행복제 용도로 사용됩니다.

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