oracle sql ile bir satırı sütundaki değer kadar çoklamak

İhtiyaç:

t tablosu
———

s1, s2
1, ‘a’
2, ‘a,b,c’
3, ‘a,b’
4, ‘c,b’

Tablosunu yukarıdaki durumdan aşağıdaki duruma çevirmek. (s2 sütununda virgül ile ayrılmış değerleri satırlara çevirmek. Bir diğer kriter de bu tablonun milyon satır olduğunda da performanslı çalışabilmesi. Bir satırın kaça parçalanacağı (kaç satıra çevirileceği) virgüller sayılarak hesaplanabilir.)

sorgu sonucu amaçlanan
———————-

s1, s2
1, ‘a’
2, ‘a’
2, ‘b’
2, ‘c’
3, ‘a’
3, ‘b’
4, ‘c’
4, ‘b’

Oracle özyinelemeli (recursive) sql sorgu ifadesi ile çözüm:

WITH split (s1, s2, s2_count, split_level) AS (

    select t1.s1, t1.s2, regexp_count(t1.s2,',') as s2_count, 1 as split_level
    from t t1

    union all

    select split.s1, split.s2, split.s2_count, split.split_level+1 as split_level
    from split
    where split_level < s2_count

)

SELECT s1, s2, s2_count, split_level,

case when s2_count > 1 and s2_count <> split_level then
      substr( s2, instr(s2,',',1,split_level), (instr(s2,',',1,split_level+1)-instr(s2,',',1,split_level)-2) )
     when s2_count > 1 and re_cnt = lvl then
       substr( s2, instr(s2,',',1,split_level), (length(s2)-instr(s2,',',1,split_level)+1) )
     else s2
end as new_s2

FROM split
ORDER BY 1,2,3,4,5

Kaynak: https://stackoverflow.com/questions/41589163/oracle-split-single-row-into-multiple-rows-based-on-column-value