오라클 connect by level 데이터 중복발생 질문드려요 1 3 4,565

by minrule [SQL Query] ORACLE CONNECTBY [2023.03.31 16:21:05]


CONNECT BY LEVEL로 데이터 복사를 하려고했는데.. 동일 데이터가 중복발생해서 한참 고민하다가 문의드립니다.

 

테이블이 이런 형식으로 있다고하면

제품ID    SUB제품수량
A-01    4
A-02    4
A-03    4
 

이것을 SUB제품수량만큼 row를 복사하고 싶어서 아래처럼 쿼리를 만들었습니다.

SELECT T.제품ID
        ,  LEVEL
  FROM 제품정보 T 
CONNECT BY LEVEL <= T.제품수량

 

하지만 위 쿼리를 실행한 결과 제품ID,LEVEL 별로 1ROW씩 생성되어 12건의 ROW가 생성되는게 아니라  제 예상과는 다르게

각 제품ID 별로 LEVEL 1은 1ROW , LEVEL 2는 3ROW , LEVEL 3은 9ROW , LEVEL 4는 27ROW 가 생성되어

총120ROW가 생성되었습니다.


무식하게 DISTINCT를 쓰면 되기는 원하는 형식의 데이터로 조회되긴하지만... 속도가 너무 느려져서 못쓸것같습니다.

데이터 중복발생을 막을 방법이 있을까요?

by pajama [2023.03.31 17:25:42]

안녕하세요. 이런 방식은 어떨지요?

with t (제품ID, 제품수량) as (
select 'A-01', 4 from dual union all
select 'A-02', 4 from dual union all
select 'A-03', 4 from dual
)
select * from t, (select level n from dual connect by level <= 100) x
where x.n <= t.제품수량
order by 제품ID

 


by 동동동 [2023.03.31 17:30:55]
WITH TMP ("제품ID", "제품수량") AS ( 
SELECT 'A-01', 4 FROM DUAL UNION ALL
SELECT 'A-02', 3 FROM DUAL UNION ALL
SELECT 'A-03', 4 FROM DUAL
)
SELECT T.제품ID
    ,  LEVEL
  FROM TMP T 
CONNECT BY LEVEL <= T.제품수량
AND PRIOR 제품ID = 제품ID
AND PRIOR SYS_GUID() IS NOT NULL;

 


by 마농 [2023.04.03 08:34:01]

Connect by level <= n 를 이용한 행 복제 방식은
dual 과 같이 1건의 자료에 대해 처리하는 방식입니다.
여러건의 자료에 직접 적용하면 안됩니다.
http://gurubee.net/article/55635

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