Nejsem si jistý, zda plně rozumím logice, kterou se snažíte implementovat, ale zde je SQL, který vytvoří vaši tabulku a duplikuje váš příkladový výstup. Byl testován na https://livesql.oracle.com
Berte to prosím s rezervou, protože pokud vaše data mohou mít duplicitní řádky nebo cykly nebo cokoli jiného, což není ukázáno ve vašem příkladu, dotaz může vyžadovat úpravu.
Obrys:
-
V klauzuli "with" otočíme "ColumnA" a "ColumnB" do jednoho sloupce a přidáme col_src, abychom zachovali, který z nich je nový "ColumnAB".
-
Poté provedeme rekurzivní dotaz a propojíme odpovídající sloupec D a sloupec A/B, který odpovídá předchozímu sloupci C.
-
Abychom odpovídali zadané objednávce, řadíme podle:
- úroveň rekurze
- sloupec C
- zda byl zdrojem sloupec A nebo B
- hodnotu sloupce A nebo 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"