2012-01-03 17 views
5

मैं इस तरह की सामग्री के साथ एक स्वयं को संदर्भित तालिका है:स्वयं संदर्भित तालिका

Self-referencing parent table 
ID ParentID Name 
--------------------- 
1    John 
2 1   Mike 
3 2   Erin 
4 1   Janie 
5    Eric 
6 5   Peter 

पेड़ पदानुक्रम इस

  • जॉन
    • माइक
        की तरह दिखना चाहिए
      • एरिन
    • जेनी
  • एरिक
    • पीटर

और एक बच्चे मेज कि माता-पिता की मेज के पत्ते कि इस तरह दिखता है संग्रहीत करता है:

ID Sales 
3 100 
3 100 
4 200 
4 200 
6 300 
6 300 
6 300 

मैं पत्ती नोड से पदानुक्रम तक राशि को रोल-अप करने की कोशिश कर रहा है, इसलिए यह वापस आ जाएगा।

ID Name Sum 
1 John 800 
2 Mike 200 
3 Erin 200 
4 Janie 400 
5 Eric 900 
6 Peter 900 

कोई विचार एसक्यूएल 2008 में इसे कैसे प्राप्त किया जाए? अग्रिम में धन्यवाद।

उत्तर

5

संपादित सभी एकत्रीकरण CTE से बाहर चले गए

WITH 
    tree AS 
(
    SELECT 
    id    AS root_id, 
    name    AS root_name, 
    id    AS leaf_id 
    FROM 
    yourTreeTable 

    UNION ALL 

    SELECT 
    tree.root_id  AS root_id, 
    tree.name   AS root_name, 
    yourTreeTable.id AS leaf_id 
    FROM 
    tree 
    INNER JOIN 
    yourTreeTable 
     ON tree.leaf_id = yourTreeTable.ParentID 
) 
SELECT 
    tree.root_id, 
    tree.root_name, 
    COALESCE(SUM(yourScoresTable.score), 0) AS total 
FROM 
    tree 
LEFT JOIN 
    yourScoresTable 
    ON yourScoresTable.ID = tree.leafID 
GROUP BY 
    tree.root_id, 
    tree.root_name 
+0

उत्तर के लिए धन्यवाद, डेम। मुझे उस क्वेरी के साथ दो त्रुटि संदेश मिल रहे हैं: 'ग्रुप बाय, हैविंग, या समेकित फ़ंक्शंस को रिकर्सिव सामान्य टेबल एक्सप्रेशन' फ्लैट्टेन्ड 'के रिकर्सिव भाग में अनुमति नहीं है। और' रिकर्सिव भाग में बाहरी जुड़ाव की अनुमति नहीं है एक पुनरावर्ती आम तालिका अभिव्यक्ति 'flattend'। '। कोई विचार? – Eric

+0

@Eric - मैं अभ्यास से बाहर हूं, मुझे यह भी याद नहीं आया कि यह मामला होगा। मैंने फिर से कोड किया है कि सभी एकत्रीकरण सीटीई के बाहर किया जाता है। – MatBailie

+0

देर से उत्तर के लिए खेद है, मुझे कल जल्दी छोड़ना पड़ा और मैं पूरी सुबह एक बैठक में रहा हूं। क्वेरी आकर्षण की तरह काम करता है। लेकिन मुझे सीटीई को समझने में परेशानी हुई और कोलेसेज का काम कैसे काम करता था। मुझे परिणाम में पेरेंट आईडी कॉलम जोड़ने की ज़रूरत है ताकि मैं ऐप में वृक्ष संरचना का पुनर्निर्माण कर सकूं लेकिन मुझे अलग-अलग गिनती मिलती है। क्या आप थोड़ा और मदद कर सकते हैं? एक बार फिर धन्यवाद। – Eric

1

संदेश यह है:

के इस स्कीमा supose करते हैं:

​create table #parent (
ID int, 
ParentID int, 
Name varchar(50)); 

create table #child (
ID int, 
Sales int); 

क्वेरी है आत्म विस्तार से बताया:

WITH 
    tree AS 
(
    SELECT 
    id as id_parent, 
    id as id 
    FROM 
    #parent 
    UNION ALL 
    SELECT 
    tree.id_parent as id_parent, 
    #parent.id AS id 
    FROM 
    tree 
    INNER JOIN 
    #parent  
     ON tree.id = #parent.ParentID 
) 
SELECT 
    #parent.id, 
    #parent.name, 
    COALESCE(SUM(#child.Sales), 0) AS total 
FROM 
    #parent 
LEFT JOIN 
    tree 
    ON #parent.ID = tree.id_parent 
LEFT JOIN 
    #child on tree.id = #child.id 
GROUP BY 
    #parent.id, 
    #parent.name 

सीटीई प्रत्येक कर्मचारी (# माता-पिता) के लिए 'पत्ते' की एक सूची देता है, फिर क्वेरी इस 'पत्ते' के लिए सभी बिक्री का सारांश देती है। You can test it running

संपादित

क्वेरी तय हो गई है।

+0

उत्तर के लिए धन्यवाद।मैंने क्वेरी चलाने की कोशिश की लेकिन मैंने देखा कि रूट नोड का योग सही नहीं है। जॉन के लिए राशि 400 के बजाय 800 होना चाहिए। – Eric

+0

@Eric, फिक्स्ड। लेकिन सावधान रहें, जॉन का योग 600 800 नहीं है (जॉन = 0, माइक = 0, एरिन = 100 + 100, जेनी = 200 + 200) – danihp

+0

मेरा बुरा। इसे ठीक करने के लिए धन्यवाद। मैंने इस मुद्दे पर बहुत अधिक घंटे बिताए हैं और अंत में मुझे जो चाहिए वह मुझे मिला। एक बार फिर धन्यवाद। – Eric