2010-03-28 7 views
6

यह क्वेरी किसी नेटवर्क में हावी होने सेट बनाती है। तो उदाहरण के लिए एक नेटवर्क दियामैं इस क्वेरी में 'ओआरए -0148 9: ​​स्ट्रिंग कॉन्सटेनेशन का परिणाम बहुत लंबा है' से कैसे छुटकारा पा सकता हूं?

A<----->B
B<----->C
B<----->D
C<----->E
D<----->C
D<----->E
F<----->E

यह रिटर्न
बी, ई
बी, एफ
ए, ई
लेकिन यह बड़े डेटा के लिए काम नहीं करता क्योंकि मैं स्ट्रिंग तरीकों का उपयोग कर रहा हूँ मेरे परिणाम में मैं स्ट्रिंग तरीकों को हटा दें और कोई लाभ नहीं हुआ

With t as (select 'A' as per1, 'B' as per2 from dual union all 
     select 'B','C' from dual union all 
     select 'B','D' from dual union all 
     select 'C','B' from dual union all 
     select 'C','E' from dual union all 
     select 'D','C' from dual union all 
     select 'D','E' from dual union all 
     select 'E','C' from dual union all 
     select 'E','D' from dual union all 
     select 'F','E' from dual) 
,t2 as (select distinct least(per1, per2) as per1, greatest(per1, per2) as per2 from t union 
     select distinct greatest(per1, per2) as per1, least(per1, per2) as per1 from t) 
,t3 as (select per1, per2, row_number() over (partition by per1 order by per2) as rn from t2) 
,people as (select per, row_number() over (order by per) rn 
      from (select distinct per1 as per from t union 
        select distinct per2 from t) 
      ) 
    ,comb as (select sys_connect_by_path(per,',')||',' as p 
       from people 
       connect by rn > prior rn 
      ) 
    ,find as (select p, per2, count(*) over (partition by p) as cnt 
      from (
        select distinct comb.p, t3.per2 
        from comb, t3 
        where instr(comb.p, ','||t3.per1||',') > 0 or instr(comb.p, ','||t3.per2||',') > 0 
       ) 
      ) 
,rnk as (select p, rank() over (order by length(p)) as rnk 
      from find 
      where cnt = (select count(*) from people) 
      order by rnk 
     ) select distinct trim(',' from p) as p from rnk where rnk.rnk = 1` 

उत्तर

0

मेरे अनुभव में आप बड़े, जटिल प्रश्नों में से निपटने के जटिल स्ट्रिंग करने के लिए नहीं करना चाहते हैं के लिए एक दृश्य या कुछ और लेकिन वापस जाने के लिए कोशिश कर रहे हैं, और इस क्वेरी काफी जटिल है । मुझे लगता है कि मौजूदा समस्या के अनुकूलन के बजाय इस समस्या को पुनर्विचार और एक अलग दृष्टिकोण से बहुत अच्छा फायदा हो सकता है।

अंतर्निहित तालिकाओं की तरह क्या दिखता है और आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? क्या डेटा मॉडल को बदलना संभव है?

+0

डेटा ए <---> बी, बी <---> सी ...., ऊपर दिखाया गया अंतर्निहित डेटा है। वे उपयोगकर्ता और मित्र संबंध के एक रूप का प्रतिनिधित्व करते हैं। मैं इस दिए गए नेटवर्क में न्यूनतम डोमिनिंग सेट खोजने की कोशिश कर रहा हूं सोशल नेटवर्क में न्यूनतम वर्चस्व सेट, उन लोगों का समूह है जो सामूहिक रूप से नेटवर्क में प्रत्येक व्यक्ति के साथ मित्र हैं यहां पर हावी होने पर अधिक जानकारी : http: //en.wikipedia।संगठन/विकी/डोमिनिंग_सेट –

6

ओरेकल की सीमाओं में से एक यह है कि एसक्यूएल 4000 वर्णों से बड़ा VARCHAR2 को संभाल नहीं सकता है। यदि आप इस आकार से अधिक स्ट्रिंग को वापस करने का प्रयास करते हैं तो यह ओआरए -0148 9 को नुकसान पहुंचाता है। आदर्श रूप से आपको परिणाम को कई छोटी पंक्तियों में तोड़ने का प्रयास करना चाहिए। वैकल्पिक रूप से आप इसे एक सीएलओबी के रूप में वापस कर सकते हैं।

संपादित

मैं कैसे एक CLOB

हम्म के रूप में ऊपर लौट सकते हैं ...

अपने कोड को बारीकी से देखा करने के बाद मैं केवल जगह जो जा रहा है लगता है ओआरए -1489 को फेंकने के लिए यह लाइन है:

select sys_connect_by_path(per,',')||',' as p 
from people 

TO_CLOB() में उस कॉल को लपेटना आसान होगा। दुर्भाग्यवश पी को एक सीएलओबी में बदलना बाद में कुछ प्रसंस्करण ('पी , पी द्वारा विभाजन') तो संभवतः यह एक विकल्प नहीं है। माफ़ कीजिये।

अन्य समाधान के लिए के रूप में ....

अपनी साइट Oracle स्थानिक के लिए एक लाइसेंस है? मुझे नहीं पता कि कई साइटें हैं, लेकिन यदि आपका भाग्यशाली लोगों में से एक है (और आप 10 जीआर 2 या उच्चतर का उपयोग कर रहे हैं) तो आपको Oracle Spatial Network Data Model (PDF) देखें।

अन्यथा, अगर sys_connect_by_path() कॉल के आउटपुट को प्रतिबंधित करने का कोई तरीका नहीं है, तो आपको इसे पीएल/एसक्यूएल में लागू करना होगा। अंतिम आउटपुट लौटने के लिए आप PIPELINED FUNCTION का उपयोग कर सकते हैं ताकि आप इसे अभी भी एक SELECT कथन से कॉल कर सकें।

+0

सीएलओबी ?, मैं उपरोक्त को सीएलओबी के रूप में कैसे वापस कर सकता हूं। कृपया "hurl ORA-1489" के लिए –

+0

+1 को समझाएं – EvilTeach

संबंधित मुद्दे