Не съм сигурен дали разбирам напълно логиката, която се опитвате да приложите, но ето SQL, който създава вашата таблица и дублира вашия примерен изход. Беше тестван на https://livesql.oracle.com
Моля, приемете това със зърно сол, защото ако вашите данни може да имат дублиращи се редове или цикли или какво ли още не, което не е демонстрирано във вашия пример, заявката може да се нуждае от промяна.
Контур:
-
В клаузата „with“ завъртаме „ColumnA“ и „ColumnB“ в една колона и добавяме col_src, за да запазим коя е новата „ColumnAB“.
-
След това правим рекурсивна заявка, свързвайки се чрез съответстваща колона D и колона A/B, която съответства на предишната колона C.
-
За да съответства на предоставения ред, сортираме по:
- нивото на рекурсия
- колона C
- дали източникът е колона A или B
- стойността на колона A или B
create table mytable as
select 'A' "ColumnA",'B' "ColumnB",'C' "ColumnC",'E' "ColumnD" from dual
union select 'D' "ColumnA",'C' "ColumnB",'F' "ColumnC",'E' "ColumnD" from dual
union select 'C' "ColumnA",'H' "ColumnB",'I' "ColumnC",'E' "ColumnD" from dual
union select 'C' "ColumnA",'W' "ColumnB",'S' "ColumnC",'E1' "ColumnD" from dual
;
with temp as (
select "ColumnA" as "ColumnAB", "ColumnC", "ColumnD", 'A' as col_src
from mytable
union all select "ColumnB", "ColumnC", "ColumnD", 'B' as col_src
from mytable
)
select connect_by_root("ColumnAB") "ColumnV", "ColumnC" as "ColumnW" from temp
connect by prior "ColumnD" = "ColumnD" and prior "ColumnC" = "ColumnAB"
order by level,"ColumnC",col_src, "ColumnAB"