Tôi không chắc liệu mình có hiểu đầy đủ logic mà bạn đang cố gắng triển khai hay không, nhưng đây là SQL tạo bảng của bạn và sao chép đầu ra mẫu của bạn. Nó đã được thử nghiệm trên https://livesql.oracle.com
Vui lòng hiểu điều này với một chút muối vì nếu dữ liệu của bạn có thể có các hàng hoặc chu trình trùng lặp hoặc không có gì, điều này không được thể hiện trong ví dụ của bạn, thì truy vấn có thể cần được sửa đổi.
Dàn ý:
-
Trong mệnh đề "with", chúng tôi xoay "ColumnA" và "ColumnB" thành một cột duy nhất và thêm col_src để giữ nguyên "ColumnAB" mới là cột nào.
-
Sau đó, chúng tôi truy vấn đệ quy, kết nối bằng cột D phù hợp và cột A / B khớp với cột C trước đó.
-
Để phù hợp với thứ tự được cung cấp, chúng tôi sắp xếp theo:
- mức đệ quy
- cột C
- nguồn là cột A hay B
- giá trị của cột A hoặc 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"