मुझे यकीन नहीं है कि मैं उस तर्क को पूरी तरह से समझता हूं जिसे आप लागू करने का प्रयास कर रहे हैं, लेकिन यहां SQL है जो आपकी तालिका बनाता है और आपके उदाहरण आउटपुट को डुप्लिकेट करता है। इसका परीक्षण https://livesql.oracle.com पर किया गया था।
कृपया इसे नमक के दाने के साथ लें क्योंकि यदि आपके डेटा में डुप्लिकेट पंक्तियाँ या चक्र या क्या नहीं हो सकता है, जो आपके उदाहरण में प्रदर्शित नहीं है, तो क्वेरी में संशोधन की आवश्यकता हो सकती है।
रूपरेखा:
-
"with" क्लॉज में, हम "ColumnA" और "ColumnB" को एक ही कॉलम में पिवट करते हैं, और यह संरक्षित करने के लिए col_src जोड़ते हैं कि नया "ColumnAB" कौन सा है।
-
फिर हम एक मेल खाने वाले कॉलम डी और पिछले कॉलम सी से मेल खाने वाले कॉलम ए/बी से जुड़ते हुए दोबारा पूछताछ करते हैं।
-
प्रदान किए गए आदेश से मिलान करने के लिए, हम इसके अनुसार क्रमबद्ध करते हैं:
- पुनरावर्ती स्तर
- कॉलम सी
- क्या स्रोत कॉलम ए या बी था
- कॉलम 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"