Jag är inte säker på om jag helt förstår logiken du försöker implementera, men här är SQL som skapar din tabell och duplicerar din exempelutdata. Den testades på https://livesql.oracle.com
Vänligen ta detta med en nypa salt, för om din data kan ha dubbletter av rader eller cykler eller något annat, som inte visas i ditt exempel, kan frågan behöva modifieras.
Översikt:
-
I "with"-satsen pivoterar vi "ColumnA" och "ColumnB" till en enda kolumn och lägger till col_src för att bevara vilken den nya "ColumnAB" är.
-
Sedan frågar vi rekursivt och kopplar samman med en matchande kolumn D och en kolumn A/B som matchar föregående kolumn C.
-
För att matcha den angivna beställningen sorterar vi efter:
- rekursionsnivån
- kolumn C
- om källan var kolumn A eller B
- värdet för kolumnen A eller 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"