कुछ इस तरह (यह मानते हुए कि इनपुट तालिका में कोई डुप्लिकेट पंक्तियाँ नहीं हैं - यदि हैं, तो समाधान को थोड़ा संशोधित करने की आवश्यकता है)।
समाधान में मैं परीक्षण के लिए test_table बनाता हूं (यह समाधान का हिस्सा नहीं है), और मैं खंड के साथ में एक और तथ्यात्मक उपश्रेणी का निर्माण करता हूं। यह Oracle 11 और इसके बाद के संस्करण में काम करता है। Oracle के पुराने संस्करणों के लिए, सबक्वेरी को prep
. के रूप में परिभाषित किया गया है इसके बजाय अंतिम क्वेरी के भीतर एक सबक्वेरी के रूप में स्थानांतरित करने की आवश्यकता है।
with
test_table ( id, identifiers ) as (
select '1', '|1|2|' from dual union all
select '1', '|2|1|' from dual union all
select '2', '|3|A|1|B|' from dual union all
select '2', '|B|1|3|A|' from dual union all
select '3', '|1|3|2|' from dual union all
select '3', '|1|5|' from dual union all
select '3', '|2|1|3|' from dual union all
select '4', '|AA|BB|1|3A|' from dual union all
select '4', '|1|3A|AA|BB|' from dual
),
prep ( id, identifiers, token ) as (
select id, identifiers, regexp_substr(identifiers, '[^|]+', 1, level)
from test_table
connect by level <= regexp_count(identifiers, '\|') - 1
and prior identifiers = identifiers
and prior sys_guid() is not null
)
select distinct id,
'|' || listagg(token, '|') within group (order by token) || '|'
as identifiers
from prep
group by id, identifiers
order by id, identifiers -- ORDER BY is optional
;
आउटपुट :
ID IDENTIFIERS
--- --------------------
1 |1|2|
2 |1|3|A|B|
3 |1|2|3|
3 |1|5|
4 |1|3A|AA|BB|
5 rows selected.