This article shows simple method to duplicate records based on value in a column.
For example following query returns 3 records
select 'a' letter, 2 num from dual union all select 'b', 4 from dual union all select 'c', 4 from dual LETTER NUM ------ ---------- a 2 b 4 c 4
to duplicate records based on column NUM you can do following transformation using CONNECT BY
with a as ( select 'a' letter, 2 num from dual union all select 'b', 4 from dual union all select 'c', 4 from dual ) select a.*, b.column_value from a, table(cast(multiset( select level from dual connect by level <= num ) as sys.odciNumberList)) b; LETTER NUM COLUMN_VALUE ------ ---------- ------------ a 2 1 a 2 2 b 4 1 b 4 2 b 4 3 b 4 4 c 4 1 c 4 2 c 4 3 c 4 4
You can use above method CONNECT BY to transform complex string (comma separated string) in a column into multiple records and simple string(split based on comma)
select 'a,b,c' letter from dual union all select 'g,h' from dual union all select 'm,k,l' from dual LETTER ------ a,b,c g,h m,k,l
and now simple
with a as ( select 'a,b,c' letter from dual union all select 'g,h' from dual union all select 'm,k,l' from dual ) select a.*, b.column_value from a, table(cast(multiset( select regexp_substr(letter,'[^,]+',1,level) from dual connect by level <= regexp_count(letter, ',')+1) as sys.odciVarchar2List)) b; LETTER COLUMN_VALUE ------ ---------------- a,b,c a a,b,c b a,b,c c g,h g g,h h m,k,l m m,k,l k m,k,l l
Have a fun 🙂
Tomasz
Excelent!, thanks for sharing!, just what i was looking for!