2010-08-24 10 views
7

सरल डेटा संरचना को देखते हुए:एसक्यूएल वृक्ष संरचना को पुनः प्राप्त करने अच्छी तरह से

ID | Category_Name | Parent_ID 

उदाहरण:

1   Cars     0 
2   Boxes     0 
3   Lamborghinis   1 
4   VW Camper Vans   1 
5   Big Boxes    2 
6   Small Boxes    2 
7   Cereal Boxes   2 
8   Broken Lambos   3 
9   Yellow Ones    3 
10   Rusty     8 
11   Milkshake Stained  8 
12   Chocolate Flavour  11 
13   Strawberry    11 
14   Indiscernible Solution 11 

एक साधारण पेड़ नेविगेशन संरचना प्रतिनिधित्व करते हुए, क्या प्रोग्राम के लिए सबसे अच्छा तरीका में पेड़ को पुनः प्राप्त करने के लिए होगा एक प्रस्तुत प्रारूप? क्या हम उन्हें 'क्रम में' पुनर्प्राप्त करने के लिए एक SQL कथन बना सकते हैं?

किसी भी मदद के लिए धन्यवाद! यदि मेरा दृष्टिकोण गलत है, तो भी टिप्पणी करने के लिए स्वतंत्र महसूस करें।

मैं एसक्यूएल सर्वर-उपयोग कर रहा हूँ 2000

+0

डेटाबेस मंच क्या है कर सकता है? कई सामान्य एसक्यूएल समाधान मंच विशिष्ट हैं। –

+0

अद्यतन प्रश्न, एसक्यूएल-सर्वर –

+1

आप किस डाटाबेस का उपयोग कर रहे हैं? यदि इसका एमएस-एसक्यूएल 2005 और ऊपर है, तो क्या आपने रिकर्सिव सीटीई की जांच की है? – InSane

उत्तर

2

यदि आप SQL Server 2008 का उपयोग कर रहे हैं तो आप नए hierarchyid डेटा प्रकार को आजमा सकते हैं।

यदि आप एक और तरीका नहीं हैं तो nested sets मॉडल जो सभी डेटाबेस पर काम करता है, को देखना है।

यदि आप SQL सर्वर 2005 का उपयोग कर रहे हैं और ऊपर आप वृक्ष संरचना को पुनः प्राप्त करने के लिए recursive CTEs का उपयोग कर सकते हैं।

SQL2000 के लिए
+0

+1 जानकारी के लिए धन्यवाद, एसक्यूएल 2000 पर हालांकि: @) –

+0

तब एकमात्र तरीका थोड़ी देर लूप का उपयोग करना है, अस्थायी तालिका में डालें और उनको वापस लौटाएं। मैं आपको नेस्टेड सेट मॉडल में देखने के लिए आग्रह करता हूं, हालांकि। –

2

मैं आमतौर पर अपने आवेदन कोड में वृक्ष संरचना का निर्माण। आंशिक रूप से क्योंकि मैं एसक्यूएल से सी # के साथ अधिक आत्मविश्वास में हूं, लेकिन यह भी इसलिए है क्योंकि मुझे आमतौर पर डेटा को उपयुक्त सी # संरचनाओं में संसाधित करने की आवश्यकता होती है।

एसक्यूएल सूचियों और पेड़ों जैसे रिकर्सिव संरचनाओं में काफी खराब है। अगर मुझे अपने डेटाबेस में पेड़ की इमारत डालना पड़ा तो मैं एक संग्रहीत प्रक्रिया के लिए जाना चाहूंगा। लेकिन एक स्मार्ट तरीका हो सकता है जिसके बारे में मुझे नहीं पता।

यदि आप ओरेकल का उपयोग करते हैं तो आप Connect By के साथ कुछ हैक करने में सक्षम हो सकते हैं।

2

नहीं, लेकिन अगर आप 2K5 को उन्नत करने के लिए प्रबंधन, आप

WITH t AS(SELECT id, parent_id, category_name FROM mytable WHERE parent_id IS NULL 
      UNION ALL 
      SELECT c.id, c.parent_id, c.category_name FROM t p JOIN mytable c ON c.parent_id = p.id) 
SELECT * FROM t 
+0

धन्यवाद, बहुत रोचक! क्या एसक्यूएल 2000 में काम करने के लिए इसे तोड़ना संभव है? क्या आपको लगता है? –

+0

नहीं, एसपी का उपयोग किए बिना नहीं। – erikkallen

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