実装しようとしているロジックを完全に理解しているかどうかはわかりませんが、テーブルを作成して出力例を複製するSQLを次に示します。 https://livesql.oracle.com でテストされました。
データに重複する行やサイクルなどが含まれている可能性がある場合は、例に示されていませんが、クエリを変更する必要がある可能性があるため、これを一言で理解してください。
概要:
-
「with」句では、「ColumnA」と「ColumnB」を1つの列にピボットし、col_srcを追加して、新しい「ColumnAB」がどちらであるかを保持します。
-
次に、一致する列Dと前の列Cに一致する列A / Bで接続して、再帰的にクエリを実行します。
-
提供された順序に一致させるために、次の順序で並べ替えます。
- 再帰レベル
- 列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"