[ORACLE] 특정컬럼의 LENGTH(COLUMN) 수만큼 복제 레코드를 만들고 싶습니다. 0 2 378

by 열공이 [SQL Query] 레코드복제 [2019.09.19 21:51:53]


데이터 이행을 하는데 다음의 QUERY가 필요하여 도움을 청합니다.

제품공정테이블(tb_product_works)에서 통과공정코드 길이 [ length(passed_works)] 만큼의 레코드를 만들고(max 4개), 각 레코드에 1~4까지의 번호가 부여된 레코드를 얻고 싶습니다. 

 

table명 :  tb_product_works -- 제품공정 테이블

항목 : product_no varchar2(10) not null , -- 제품번호 pk

         passed_works varchar2(4),   -- 통과공정코드: 1byte부터 4byte까지 공정통과시 마다 추가됨 (B --> BC--> BCK --> BCKT)

         product_size  varchar2(5)  -- 제품size코드

        

 

sample) lenhgth(passed_works)가 2인 경우

     product_no : A0010

     passed_works : BC -- length(passed_works)는 2

     product_size : D010

 

원하는형태 (2개를 복제함)

     product_no : A0010

     seq : 1

     passed_works : BC 

     product_size : D010

 

     product_no : A0010

     seq : 2

     passed_works : BC

     product_size : D010

 

sample) lenhgth(passed_works)가 3인 경우

     product_no : A0020

     passed_works : AXC -- length(passed_works)는 3

     product_size : D020

 

원하는형태 (3개를 복제함)

     product_no : A0020

     seq : 1

     passed_works : AXC 

     product_size : D020

 

     product_no : A0020

     seq : 2

     passed_works : AXC 

     product_size : D020

 

     product_no : A0020

     seq : 3

     passed_works : AXC 

     product_size : D020

 

 

select 'A0100' id, 'BC' works from dual union all 
select 'A0200' , 'AXC'  from dual  


A0100, BC     -- length(works)가 2임 ==> 2개 레코드복제 
A0200, AXC   -- length(works)가 3임  ==> 3개 레코드복제

<원하는 data> 
A0100,1,BC
A0100,2,BC
A0200,1,AXC
A0200,2,AXC
A0200,3,AXC

by jkson [2019.09.20 08:13:52]
with t as
(
select 'A0100' id, 'BC' works from dual union all 
select 'A0200' , 'AXC'  from dual  
)
select id, lv, works
  from t
    , (select level lv from dual connect by level <= 30) -- works 최대길이 30이라고 가정
 where lv <= length(t.works)
 order by id, lv

 


by 마농 [2019.09.20 08:17:26]
WITH t AS
(
SELECT 'A0100' id, 'BC' works FROM dual
UNION ALL SELECT 'A0200', 'AXC' FROM dual
)
SELECT id
     , seq
     , works
  FROM t
     , (SELECT LEVEL seq FROM dual CONNECT BY LEVEL <= 4)
 WHERE seq <= LENGTH(works)
 ORDER BY id, seq
;
-- http://gurubee.net/article/55635

 

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