2008-09-22 14 views
8

एक सरल (आईडी, वर्णन) तालिका t1 को देखते हुए, इस तरह केओरेकल पेड़ में अन्य तालिकाओं में शामिल होने से प्रश्नों

id description 
-- ----------- 
1 Alice 
2 Bob 
3 Carol 
4 David 
5 Erica 
6 Fred 

और एक माता पिता के बच्चे का रिश्ता तालिका t2, जैसे

parent child 
------ ----- 
1  2 
1  3 
4  5 
5  6 

ओरेकल प्रदान करता है के रूप में कुछ कस्टम वाक्य रचना एक्सटेंशन के साथ एक पेड़ के रूप में इस traversing का एक तरीका:

select parent, child, sys_connect_by_path(child, '/') as "path" 
from t2 
connect by prior parent = child 

सटीक सिंटैक्स महत्वपूर्ण नहीं है, और मैंने शायद उपरोक्त में गलती की है। यह संभव sys_connect_by_path() के भीतर एक और तालिका में शामिल होने का, इस तरह के t1 तालिका के रूप में ऊपर है, की तरह कुछ का निर्माण करने के: महत्वपूर्ण बात यह है कि इसके बाद के संस्करण कुछ है कि

parent child path 
------ ----- ---- 
1  2  /1/2 
1  3  /1/3 
4  5  /4/5 
4  6  /4/5/6 
5  6  /5/6 

तरह लग रहा है का उत्पादन करेगा मेरा प्रश्न यह है :

parent child path 
------ ----- ---- 
1  2  /Alice/Bob 
1  3  /Alice/Carol 
... and so on... 

उत्तर

7

आपकी क्वेरी में, एक सबक्वेरी कि T1 और टी 2 मिलती है, और रिटर्न माता पिता, बच्चे और बच्चे विवरण के साथ टी 2 की जगह। फिर sys_connect_by_path फ़ंक्शन में, अपने सबक्वायरी से बाल विवरण का संदर्भ लें।

+0

दूसरे शब्दों में, व्युत्पन्न तालिका का उपयोग करें। बेशक! अच्छी चाल। – dland

0
SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path" 
FROM T1 parents, T1 childs, T2 
WHERE T2.parent = parents.id 
AND T2.child = childs.id 
CONNECT BY PRIOR parent = child 
+0

यह काफी काम नहीं करता है। बहु-स्तरीय पदानुक्रमों के मामले में पथ गलत है। उदाहरण के लिए डेविड/एरिका/फ्रेड – dland

6

माइक मैकएलिस्टर के विचार के आधार पर, निम्नलिखित एक व्युत्पन्न तालिका का उपयोग करता वांछित परिणाम प्राप्त करने:

select 
    T.PARENT 
    ,T.CHILD 
    ,sys_connect_by_path(T.CDESC, '/') 
from 
    (
     select 
      t2.parent  as PARENT 
      ,t2.child  as CHILD 
      ,t1.description as CDESC 
     from 
      t1, t2 
     where 
      t2.child = t1.id 
    ) T 
where 
    level > 1 and connect_by_isleaf = 1 
connect by prior 
    T.CHILD = T.PARENT 

मेरी समस्या में, माता-पिता एक "सुपर-माता पिता" रूट के तहत सहारा लेने लगते हैं, जिसका अर्थ है कि पथों को पूरी तरह से SYS_CONNECT_BY_PATH के साथ वर्णित किया जा सकता है, जिससे पथ के साथ अभिभावक को संयोजित करने की कैगकोबॉय की तकनीक की आवश्यकता को रोक दिया जा सकता है।

+1

के बजाय डेविड/फ्रेड/एरिका, आपका सामान यहां देने के लिए धन्यवाद। मेरी इच्छा है कि अधिक लोग ऐसा करेंगे, यह अगले व्यक्ति की मदद करता है जो इस जवाब की तलाश में स्टैक ओवरव्लो में आता है। –

+1

शब्द obviate का अच्छा उपयोग! :-) – cagcowboy

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