2010-07-05 14 views
7

द्वारा कॉम्प्लेक्स टीएसक्यूएल ऑर्डर इस उदाहरण के लिए क्रमशः child और parent नामक दो फ़ील्ड (दोनों प्रकार के आईएनटी) के लिए निम्नलिखित मानदंड सुनिश्चित करने के लिए एक ऑर्डर द्वारा क्लॉज तैयार करना संभव है।क्लॉज

  1. parent संदर्भ child, लेकिन शून्य हो सकता है।
  2. माता-पिता के कई बच्चे हो सकते हैं; एक बच्चा केवल एक माता पिता।
  3. एक बच्चा अपने आप का माता पिता नहीं हो सकता है।
  4. माता-पिता के बिना कम से कम एक बच्चे मौजूद होना चाहिए।
  5. child का प्रत्येक मान क्रमशः परिणाम सेट में parent में दिखाई देने से पहले प्रकट होना चाहिए।

मैं बिंदु के साथ कठिनाई आ रही है 5.

नमूना अव्यवस्थित डेटा:

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

जाहिर न ORDER BY a, b या ORDER BY b, a काम करते हैं। वास्तव में जितना अधिक मैं इसके बारे में सोचता हूं, मुझे यकीन नहीं है कि यह भी किया जा सकता है। प्रतिबंधों को देखते हुए,

child parent 
------------ 
1  2 
2  1 

की अनुमति नहीं है क्योंकि यह नियम 3 और 4 (और स्पष्ट रूप से 5) का उल्लंघन करती है।

तो, क्या मैं संभव हासिल करने की कोशिश कर रहा हूं, और यदि ऐसा है तो कैसे? प्लेटफार्म एसक्यूएल सर्वर है 2005

अद्यतन: नमूना डेटा के लिए वांछित सॉर्ट क्रम:

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

प्रत्येक पंक्ति के लिए है कि माता-पिता कॉलम में एक गैर शून्य मान परिभाषित करता है, मूल्य पहले से ही मौजूद है बाल कॉलम int।

+0

आप वांछित क्रम में नमूना डेटा, कृपया दिखाने सकते हैं? वह एक मदद होगी। –

+0

आपके अनुरोध के अनुसार, ब्रायन जोड़ा गया। –

उत्तर

6

आप एक पुनरावर्ती CTE इस्तेमाल कर सकते हैं प्रत्येक नोड के "गहराई", और आदेश है कि द्वारा खोजने के लिए:

create table node (id int, parent int) 
insert into node values (1, null) 
insert into node values (2, 5) 
insert into node values (3, 5) 
insert into node values (4, 2) 
insert into node values (5, null) 
insert into node values (6, 4); 

with node_cte (id, depth) as (
    select id, 0 from node where parent is null 
    union all 
    select node.id, node_cte.depth + 1 
    from node join node_cte on node.parent = node_cte.id  
) 

select node.* 
from node 
join node_cte on node_cte.id=node.id 
order by node_cte.depth asc 
+1

आह, रिकर्सिव सीटीई। क्या ऐसा कुछ भी है जो वे नहीं कर सकते? –

1

आप इसे 'ऑर्डर बाय' क्लॉज के साथ नहीं कर पाएंगे क्योंकि आवश्यकता 5 निर्दिष्ट करता है कि ऑर्डर डेटा पदानुक्रम के प्रति संवेदनशील है। SQL सर्वर 2005 पदानुक्रम डेटा में आमतौर पर रिकर्सिव सीटीई का उपयोग करने के साथ निपटाया जाता है; शायद यहां कोई व्यक्ति इस मामले के लिए उपयुक्त कोड प्रदान करेगा।