आपकी टिप्पणी से लेकर @PrzemyslawKruglej उत्तर तक
<ब्लॉकक्वॉट>
मुख्य समस्या connect by
. के साथ आंतरिक क्वेरी के साथ है , यह पंक्तियों की आश्चर्यजनक मात्रा उत्पन्न करता है
उत्पन्न पंक्तियों की मात्रा को निम्न दृष्टिकोण से कम किया जा सकता है:
/* test table populated with sample data from your question */
SQL> create table t1(str) as(
2 select 'a;b;c' from dual union all
3 select 'b;c;d' from dual union all
4 select 'a;c;d' from dual
5 );
Table created
-- number of rows generated will solely depend on the most longest
-- string.
-- If (say) the longest string contains 3 words (wont count separator `;`)
-- and we have 100 rows in our table, then we will end up with 300 rows
-- for further processing , no more.
with occurrence(ocr) as(
select level
from ( select max(regexp_count(str, '[^;]+')) as mx_t
from t1 ) t
connect by level <= mx_t
)
select count(regexp_substr(t1.str, '[^;]+', 1, o.ocr)) as generated_for_3_rows
from t1
cross join occurrence o;
परिणाम:तीन पंक्तियों के लिए जहां सबसे लंबी पंक्ति तीन शब्दों से बनी है, हम 9 पंक्तियाँ उत्पन्न करेंगे :
GENERATED_FOR_3_ROWS
--------------------
9
अंतिम क्वेरी:
with occurrence(ocr) as(
select level
from ( select max(regexp_count(str, '[^;]+')) as mx_t
from t1 ) t
connect by level <= mx_t
)
select res
, count(res) as cnt
from (select regexp_substr(t1.str, '[^;]+', 1, o.ocr) as res
from t1
cross join occurrence o)
where res is not null
group by res
order by res;
परिणाम:
RES CNT
----- ----------
a 2
b 2
c 3
d 2
SQLFIddle डेमो
regexp_count()(11g और up) और regexp_substr() रेगुलर एक्सप्रेशन फ़ंक्शंस के बारे में अधिक जानें।
नोट: नियमित अभिव्यक्ति गणना करने के लिए अपेक्षाकृत महंगा कार्य करता है, और जब बहुत बड़ी मात्रा में डेटा को संसाधित करने की बात आती है, तो यह एक सादे पीएल/एसक्यूएल पर स्विच करने पर विचार करने योग्य हो सकता है। यहाँ एक उदाहरण है।