Saya tidak yakin apakah saya sepenuhnya memahami logika yang Anda coba terapkan, tetapi inilah SQL yang membuat tabel Anda dan menduplikasi contoh output Anda. Itu diuji di https://livesql.Oracle.com
Harap ambil ini dengan sebutir garam karena jika data Anda mungkin memiliki baris atau siklus duplikat atau yang lainnya, yang tidak ditunjukkan dalam contoh Anda, kueri mungkin perlu dimodifikasi.
Garis Besar:
-
Dalam klausa "with", kami memutar "ColumnA" dan "ColumnB" menjadi satu kolom, dan menambahkan col_src untuk mempertahankan "ColumnAB" yang baru.
-
Kemudian kita melakukan query secara rekursif, menghubungkan dengan kolom D yang cocok dan kolom A/B yang cocok dengan kolom C sebelumnya.
-
Untuk mencocokkan urutan yang disediakan, kami mengurutkan berdasarkan:
- tingkat rekursi
- kolom C
- apakah sumbernya kolom A atau B
- nilai kolom A atau 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"