Jeg er ikke sikker på, om jeg fuldt ud forstår den logik, du forsøger at implementere, men her er SQL, der opretter din tabel og duplikerer dit eksempeloutput. Det blev testet på https://livesql.oracle.com
Tag dette med et gran salt, for hvis dine data kan have duplikerede rækker eller cyklusser eller hvad der ikke er demonstreret i dit eksempel, skal forespørgslen muligvis ændres.
Disposition:
-
I "with"-klausulen pivoterer vi "ColumnA" og "ColumnB" til en enkelt kolonne og tilføjer col_src for at bevare, hvilken den nye "ColumnAB" er.
-
Derefter forespørger vi rekursivt og forbinder med en matchende kolonne D og en kolonne A/B, der matcher den forrige kolonne C.
-
For at matche den angivne bestilling sorterer vi efter:
- rekursionsniveauet
- kolonne C
- om kilden var kolonne A eller B
- værdien af kolonne 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"