2009-02-19 14 views
9

छवि आप थ्रेडेड चर्चा बोर्ड के लिए डीबी स्कीमा बना रहे हैं। क्या किसी दिए गए थ्रेड के लिए उचित क्रमबद्ध सूची का चयन करने का कोई प्रभावी तरीका है? जिस कोड को मैंने लिखा है वह काम करता है लेकिन जिस तरह से मैं इसे भी पसंद करूंगा।रिकर्सिव एसक्यूएल सीटीई और कस्टम सॉर्ट ऑर्डरिंग

मान लीजिए कि आपके पास यह डेटा करते हैं: आदर्श रूप में

1 
|- 2 
| |- 3 
| | |- 5 
|- 4

, कोड में, हम परिणाम में प्रदर्शित करने के लिए सेट हैं:

ID | ParentID 
----------------- 
1 | null 
2 | 1 
3 | 2 
4 | 1 
5 | 3

तो संरचना ऐसी लग माना जाता है निम्न क्रम: 1, 2, 3, 5, 4
समस्या: CTE मैं इसे लिखा था के साथ वास्तव में के रूप में वापस किया जा रहा है: 1, 2, 4, 3, 5

मुझे पता है कि LINQ का उपयोग करके समूह/ऑर्डर करना आसान होगा लेकिन मैं इसे स्मृति में करने में अनिच्छुक हूं। यह इस बात यद्यपि में सबसे अच्छा समाधान की तरह लगता है ...

यहाँ है CTE मैं वर्तमान में उपयोग कर रहा हूँ:

with Replies as ( 
    select c.CommentID, c.ParentCommentID 1 as Level 
     from Comment c 
     where ParentCommentID is null and CommentID = @ParentCommentID 

    union all 

    select c.CommentID, c.ParentCommentID, r.Level + 1 as Level 
     from Comment c 
     inner join Replies r on c.ParentCommentID = r.CommentID 
) 

select * from Replies 

किसी भी मदद की सराहना की होगी; धन्यवाद!



मैं एसक्यूएल के लिए नया हूं और पहले पदानुक्रमित डेटाटाइप के बारे में नहीं सुना था। this comment से इसके बारे में पढ़ने के बाद मैंने फैसला किया कि मैं इसे अपने डिजाइन में शामिल करना चाहता हूं। मैं इस रात के साथ प्रयोग करूँगा और अगर मुझे सफलता मिलती है तो अधिक जानकारी पोस्ट करें।


अद्यतन
मेरी नमूना डेटा, dance2die के सुझाव का उपयोग करने से वापस लौटाए गए परिणाम:

ID | ParentID | Level | DenseRank 
------------------------------------- 
15  NULL   1   1 
20  15   2   1 
21  20   3   1 
17  22   3   1 
22  15   2   2 
31  15   2   3 
32  15   2   4 
33  15   2   5 
34  15   2   6 
35  15   2   7 
36  15   2   8
+0

एसक्यूएल देवता आपके दावों से क्रोधित हो जाते हैं – Shawn

उत्तर

0

Hmmmm - मुझे यकीन है कि अगर आपके संरचना सबसे अच्छा इस समस्या के लिए अनुकूल है नहीं कर रहा हूँ। मेरे सिर के ऊपर से मैं डेटा को सॉर्ट करने के लिए वैसे भी नहीं सोच सकता जैसा कि आप उपर्युक्त क्वेरी में चाहते हैं।

सबसे अच्छा मैं सोच सकता हूं कि यदि आपके पास एक अभिभावक तालिका है जो आपकी टिप्पणियों को एक साथ जोड़ती है (उदाहरण के लिए एक विषय तालिका)। यदि आप करते हैं तो आपको उस पर अपने उत्तरों में शामिल होने में सक्षम होना चाहिए (आपको स्पष्ट कॉलम को स्पष्ट रूप से शामिल करने की आवश्यकता होगी), और फिर आप विषय आईडी द्वारा क्रमबद्ध कर सकते हैं, आपके द्वारा क्रमबद्ध क्रम क्रम प्राप्त करने के लिए स्तर (या जो भी अन्य जानकारी है विषय तालिका क्रमबद्ध करने के लिए एक अच्छा मूल्य का प्रतिनिधित्व करता है)।

0

पूरे पदानुक्रम को संग्रहीत करने पर विचार करें (ट्रिगर्स के साथ इसे बदलने के लिए इसे अपडेट करने के साथ)।

अपने उदाहरण में इस क्षेत्र के लिए होगा: 1,2 1.2.3 1.2.5 1,4

तो आप सिर्फ इतना है कि मैदान पर सॉर्ट करने के लिए है, यह कोशिश करते हैं और देखते हैं:

create table #temp (test varchar (10)) 
insert into #temp (test) 
select '1' 
union select '1.2' 
union select '1.2.3' 
union select '1.2.5' 
union select '1.4' 
select * from #temp order by test asc 
+0

हाँ - इसे भौतिक मार्ग –

8

मुझे यकीन है कि आप प्यार करेंगे। मैं हाल ही में Dense_Rank() के बारे में समारोह है, जिसके लिए के लिए MSDN

बाहर की जाँच करें नीचे दिए गए कोड और कैसे अनुसार, "एक परिणाम के सेट के विभाजन के भीतर रैंकिंग" "CommentID" क्रमबद्ध हो जाता है है पता लगाना।

जहां तक ​​मैं समझता हूं, आप अपने परिणाम सेट को ParentCommentID द्वारा विभाजित करने का प्रयास कर रहे हैं।

"डेंसरकैंक" कॉलम पर ध्यान दें।

with Replies (CommentID, ParentCommentID, Level) as 
(
     select c.CommentID, c.ParentCommentID, 1 as Level 
     from Comment c 
     where ParentCommentID is null and CommentID = 1 

     union all 

     select c.CommentID, c.ParentCommentID, r.Level + 1 as Level 
     from Comment c 
       inner join Replies r on c.ParentCommentID = r.CommentID 
) 
select *, 
     denserank = dense_rank() over (partition by ParentCommentID order by CommentID) 
from Replies 
order by denserank 

alt text

परिणाम नीचे

+0

कहा जाता है, सुझाव के लिए धन्यवाद, मैं बिना किसी किस्मत के पहले काम करने के लिए dense_rank() प्राप्त करने का प्रयास कर रहा था। मैंने अपने नमूना डेटा पर अपना कोड पूछताछ की और यह लगभग ... काम किया। एक पंक्ति क्रम से बाहर थी। मैं उपरोक्त डेटा पोस्ट करूंगा। –

1

आप hierarchyid उपयोग करने के लिए (केवल sql2008) या स्ट्रिंग (या बाइट) संयोजन का एक समूह है।