संयोजन के परिणाम के लिए दिए गए दो उपनाम होने के कारण तत्काल त्रुटि होती है:आपके पास AS LIST as ids
है . आप गणना के परिणाम में दो उपनाम नहीं दे सकते। यदि आप चाहते हैं कि नव निर्मित तालिका में एक कॉलम हो LIST
फिर as ids
हटाएं , और इसके विपरीत।
फिर आप एक और त्रुटि में भाग लेंगे:आप ORDER BY t1.a
एकत्रीकरण में। वह काम नहीं करेगा; आप एक्सएमएल एकत्रीकरण में सीएलओबी द्वारा ऑर्डर नहीं कर सकते हैं। क्या आप वाकई परवाह करते हैं कि एकत्रीकरण किस क्रम में होता है? यदि आप नहीं करते हैं, तो ORDER BY NULL
. में बदलें . यदि आप परवाह करते हैं, तो आपको एक समस्या है, क्योंकि Oracle में एक order_by_clause
. है बस एक CLOB अभिव्यक्ति द्वारा आदेश नहीं दे सकता। आपको अन्य तरीकों का उपयोग करके ऑर्डर करने के लिए एक अलग कॉलम बनाना होगा।
समग्र रूप से समाधान में, खंड के साथ की कोई आवश्यकता नहीं है। जहां भी आप क्वेरी में "input_strings" का उल्लेख करते हैं (विथ क्लॉज के अलावा), बस "table_expressions" लिखें।
संपादित करें
यहां बताया गया है कि इसे कैसे काम किया जा सकता है। सबसे पहले मैं CREATE TABLE स्टेटमेंट दिखाऊंगा। मैं मान लूंगा कि table_expressions
खोज स्ट्रिंग्स का एक CLOB कॉलम है, और इस कॉलम में कोई डुप्लीकेट नहीं है। फिर भी, तालिका को डेटा प्रकार की एक अलग प्राथमिक कुंजी की भी आवश्यकता होती है, जो LOB या अन्य लंबी, गैर-मानक-प्रकार नहीं है। मैं इसके लिए NUMBER का उपयोग करता हूं।
फिर मैं इस प्राथमिक कुंजी कॉलम द्वारा एकत्रित करता हूं। काश, मैं एक ही समय में खोज स्ट्रिंग का चयन नहीं कर पाता। मैं SELECT MAX(t2.a)
लेकिन वह CLOB मूल्यों के साथ भी काम नहीं करता है! इसके बजाय, मुझे खोज स्ट्रिंग की प्राथमिक कुंजी से मिलान करने के लिए एक और जुड़ाव की आवश्यकता है। (क्षमा करें, इस वजह से क्वेरी में इतना अधिक समय लगेगा...)
एकत्रीकरण में, मैं कॉलम a
. से स्ट्रिंग मान के पहले 4000 वर्णों के आधार पर छाँटता हूँ . यह संपूर्ण इनपुट स्ट्रिंग द्वारा सॉर्ट करने जितना अच्छा नहीं है, लेकिन यह अभी भी NULL द्वारा ऑर्डर करने से बेहतर है।
create table a_x ( a, b ) as
select to_clob('atveroeosipsumloremipsumdolor'), 1 from dual union all
select to_clob('stetclitakasdtest') , 2 from dual union all
select to_clob('noseatakimataatveroeosipsum') , 3 from dual union all
select to_clob('loremipsumdolor') , 4 from dual union all
select to_clob('consetetursadipscingelitr') , 5 from dual
;
create table table_expressions ( a, pk ) as
select to_clob('atveroeosipsum') , 10 from dual union all
select to_clob('test') , 11 from dual union all
select to_clob('stetclitakasd') , 12 from dual union all
select to_clob('noseatakimata') , 13 from dual union all
select to_clob('loremipsumdolor') , 14 from dual union all
select to_clob('consetetursadipscingelitr'), 15 from dual
;
create table a_y as
select te.a, s.ids
from table_expressions te
join
(select t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()')
ORDER BY cast(t1.a as varchar2(4000))).GetClobVal(),',') as ids
from a_x t1
join table_expressions t2
on t1.a like '%' || t2.a || '%'
group by t2.pk
) s
on te.pk = s.pk
;
अब देखते हैं कि हमें क्या मिला:
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
#2 संपादित करें
यदि आपको आईडी को तालिका a_x
. से जोड़ना है (स्तंभ b
), स्वयं CLOB नहीं, फिर t1.a
. को बदलें t1.b
. के साथ (और, ORDER BY
. में XMLAGG
. का खंड , आपको किसी cast
की आवश्यकता नहीं है , बस order by t1.b
)।
drop table a_y purge;
create table a_y as
select te.a, s.ids
from table_expressions te
join
(select t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.b,',').EXTRACT('//text()')
ORDER BY t1.b).GetClobVal(),',') as ids
from a_x t1
join table_expressions t2
on t1.a like '%' || t2.a || '%'
group by t2.pk
) s
on te.pk = s.pk
;
select * from a_y;
A IDS
------------------------- ---
atveroeosipsum 1,3
test 2
stetclitakasd 2
noseatakimata 3
loremipsumdolor 1,4
consetetursadipscingelitr 5