2010-09-16 12 views
5

मेरे पास तीन कॉलम NodeId, ParentNodeId, NodeName के साथ एक तालिका है। प्रत्येक नोड के लिए मैं "lvl1/lvl2/lvl3 ..." जैसे एक पूर्ण पथ प्राप्त करना चाहता हूं, जहां lvl1, lvl2 और lvl3 नोड नाम हैं। मुझे एक फ़ंक्शन मिला जो इस लिंक पर http://www.sql-server-helper.com/functions/get-tree-path.aspx करता है। लेकिन मैं दक्षता के लिए सीटीई या किसी अन्य तकनीक का उपयोग करना चाहता हूं। यदि बेहतर तरीके से इसे हासिल करना संभव है तो कृपया मुझे बताएं। अग्रिम में धन्यवाद।पूर्ण पदानुक्रम पथ प्राप्त करने के लिए SQL क्वेरी

उत्तर

6

यहां एक सीटीई संस्करण है।

declare @MyTable table (
    NodeId int, 
    ParentNodeId int, 
    NodeName char(4) 
) 

insert into @MyTable 
    (NodeId, ParentNodeId, NodeName) 
    select 1, null, 'Lvl1' union all 
    select 2, 1, 'Lvl2' union all 
    select 3, 2, 'Lvl3' 

declare @MyPath varchar(100) 

;with cteLevels as (
    select t.NodeId, t.ParentNodeId, t.NodeName, 1 as level 
     from @MyTable t 
     where t.ParentNodeId is null 
    union all 
    select t.NodeId, t.ParentNodeId, t.NodeName, c.level+1 as level 
     from @MyTable t 
      inner join cteLevels c 
       on t.ParentNodeId = c.NodeId 
) 
select @MyPath = case when @MyPath is null then NodeName else @MyPath + '/' + NodeName end 
    from cteLevels 
    order by level 

select @MyPath 
+0

कोई भी मौका है कि आप मेरे मामले के लिए इस उत्तर को अनुकूलित करने में मेरी मदद कर सकते हैं? http://stackoverflow.com/q/5549480/93202 –

0

लिए सबसे कारगर तरीका, मेरे अनुभव में, एक अतिरिक्त क्षेत्र, RootNodeID जोड़ने के लिए, treestructure की उच्चस्तरीय नोड की आईडी से युक्त होगा। तो आप एक संपूर्ण प्रक्रिया में सभी नोड्स को एक बहुत ही सरल और कुशल तरीके से पूछ सकते हैं।

और उस शोध को बनाने के लिए, आपके आवेदन में एक सरल पुनरावर्ती कार्य ठीक काम करना चाहिए।

मुझे पता है कि यह denormalization है, और कुछ लोग वास्तव में अवधारणा को स्वीकार नहीं करते हैं, लेकिन मैंने अपने पेशेवर अनुभव में सीखा है कि यह एक विस्तृत टी-एसक्यूएल स्क्रिप्ट के विपरीत, एक बड़ा प्रदर्शन वृद्धि लाता है।

+0

क्या आप इसके लिए एक सरल कोड उदाहरण प्रदान कर सकते हैं? – RKP

+0

आप इसे किस भाषा में पसंद करेंगे? –

+0

एसक्यूएल सर्वर ट्रांजैक्ट एसक्यूएल – RKP

4

मैंने इसे इस तरह हल किया, जो जो के समाधान के समान था।

with cte (NodeId,NodeName,hierarchyPath)as 
(
    select NodeId,NodeName, NodeName 
    from Node 
    where ParentNodeId is null 
    union all 
    select n.NodeId, n.NodeName, CONVERT(varchar(256), cte.hierarchyPath + '/' + n.NodeName) 
    from Node n 
    join cte on n.ParentNodeId = cte.NodeId 
) 

select * 
from cte 
order by NodeId 
संबंधित मुद्दे