2011-12-22 14 views
5

तक एक पेड़ शाखा संरचना का चयन करें क्या एक सीडीई में एक पैरामीटर पास करना संभव है जो नोड का चयन करता है, फिर उसके माता-पिता को रूट पर चुनता है जहां parentId शून्य है?एसक्यूएल सर्वर सीटीई रूट

नीचे दिए गए कोड में यदि मैं रेन कोट्स का चयन करने वाले पैरामीटर में पास करता हूं और फिर पेड़ को पुरुषों के पहनने के लिए दोहराता हूं जहां parentId शून्य है और बच्चों सहित उस शाखा में सभी नोड्स का चयन करता है। क्या कोई मेरी मदद कर सकता है कृपया। मेरे उदाहरण सिर्फ recurses और गहराई

एसक्यूएल उदाहरण दिखाता है:

DECLARE @Department TABLE 
(
    Id INT NOT NULL, 
    Name varchar(50) NOT NULL, 
    ParentId int NULL 
) 

INSERT INTO @Department SELECT 1, 'Toys', null 
INSERT INTO @Department SELECT 2, 'Computers', null 
INSERT INTO @Department SELECT 3, 'Consoles', 2 
INSERT INTO @Department SELECT 4, 'PlayStation 3', 3 
INSERT INTO @Department SELECT 5, 'Xbox 360', 2 
INSERT INTO @Department SELECT 6, 'Games', 1 
INSERT INTO @Department SELECT 7, 'Puzzles', 6 
INSERT INTO @Department SELECT 8, 'Mens Wear', null 
INSERT INTO @Department SELECT 9, 'Mens Clothing', 8 
INSERT INTO @Department SELECT 10, 'Jackets', 9 
INSERT INTO @Department SELECT 11, 'Rain Coats', 10 

;WITH c 
AS 
(
    SELECT Id, Name,1 AS Depth 
    FROM @Department 
    WHERE ParentId is null 

     UNION ALL 

     SELECT t.Id, t.Name, c.Depth + 1 AS 'Level' 
    FROM @Department T 
    JOIN c ON t.ParentId = c.Id 

) 
SELECT * FROM c WHERE c.Id = 3 
+0

अपने वर्तमान क्वेरी के और में उत्पादन क्या है: - मैं एक नया स्तंभ StartingId जो निरंतर बनी हुई के रूप में हम पेड़ पर चलना शुरू की है यह है कि क्या हम आधारित चुन लिए जाएँगे पर है तुम क्या चाहते हो? मैं समझ नहीं पा रहा हूं कि आप क्या चाहते हैं कि पहले से ही उस क्वेरी में नहीं है। –

+0

मैं एक पैरामीटर में पास करना चाहता हूं जो नोड का चयन करता है और उसके बाद पेड़ को उस शाखा में अपने बच्चों को – ONYX

+0

के साथ पार करता है, इसलिए यदि मैं वर्षा कोट का चयन करता हूं तो मैं प्रक्रिया को ऊपर की तरफ जाना चाहता हूं और सभी माता-पिता को उस नोड तक चुनना चाहता हूं इसका मतलब है कि यह कहां है कि यह माता-पिता है, इसलिए इसमें सभी बच्चे शामिल होंगे जो – ONYX

उत्तर

13

आपकी वर्तमान CTE सिर्फ अपने Depth और अन्य सभी गुणों के साथ पेड़ में सभी आइटम, पता चलता है। इस तरह, यह ठीक काम करता है।

जो भी आप खोज रहे हैं, उसे करने के लिए, आपको सीटीई को लगभग "उलटा" करना होगा - अपने सीटीई के "एंकर" के रूप में, जिस आइटम में आप रुचि रखते हैं उसे पकड़ लें और फिर "रिकर्स" जड़:

Id ParentId Name   Depth 
11 10  Rain Coats  1 
10  9  Jackets   2 
9  8  Mens Clothing  3 
8 NULL Mens Wear   4 

अद्यतन

गहराई का एक उलटे क्रम के लिए आप c:

DECLARE @StartID INT = 11 

;WITH c 
AS 
(
    SELECT Id, ParentId, Name, 1 AS Depth 
    FROM @Department 
    WHERE Id = @startID 

    UNION ALL 

    SELECT t.Id, t.ParentId, t.Name, c.Depth + 1 AS 'Level' 
    FROM @Department T 
    INNER JOIN c ON t.Id = c.ParentId 
) 
SELECT * 
FROM c 

यह आप जो खोज और उत्पादन कर रहे हैं क्या करेंगे एक इस प्रयोग: इस से

;WITH c 
AS 
(
    SELECT Id, ParentId, Name, 1 AS Depth 
    FROM @Department 
    WHERE Id = @startID 

    UNION ALL 

    SELECT t.Id, t.ParentId, t.Name, c.Depth + 1 AS 'Level' 
    FROM @Department T 
    INNER JOIN c ON t.Id = c.ParentId 
) 
SELECT Id, 
     ParentID, 
     Name, 
     MAX(Depth) OVER() - Depth + 1 AS InverseDepth 
FROM c 

आउटपुट:

Id ParentId Name   InverseDepth 
11 10  Rain Coats  4 
10  9  Jackets   3 
9  8  Mens Clothing  2 
8 NULL Mens Wear   1 
+0

आपको रिवर्स ऑर्डर में गहराई को कैसे बदलते हैं, पीछे पहनने वाले पुरुषों पहनने के लिए 1 - 4 रेन कोट्स पहनते हैं। और क्या यह सभी बच्चों को प्रत्येक नोड – ONYX

+0

@ केडीएम का उपयोग करने का चयन करता है: प्रत्येक नोड के तहत सभी बच्चों का चयन करें * ?? आप किसी दिए गए नोड से पेड़ को ऊपर ले जा रहे हैं - प्रत्येक नोड में हमेशा एक पैरेंट नोड होता है, और यही वह है जो –

+0

@ केडीएम चुना जाता है - आप मुख्य में गहराई के रूप में 'row_number() ओवर (गहराई से आदेश) का उपयोग कर सकते हैं क्वेरी। –

4

वर्तमान में, अपने CTE अपने लंगर के रूप में जड़ है, और अपनी पुनरावर्ती भाग में बच्चे को माता पिता से चला जाता है। यदि आप पूरे पेड़ को चाहते हैं, तो आपको ब्याज के बच्चे से शुरू करने की आवश्यकता होगी, और अपना रास्ता तैयार करें। ऐसा करने का यह एक तरीका है।

;WITH c 
AS 
(
    SELECT Id AS StartingId, Id, ParentId, Name, 0 AS Height 
    FROM @Department 

    UNION ALL 

    SELECT c.StartingId, p.Id, p.ParentId, p.Name, c.Height + 1 AS Height 
    FROM @Department p INNER JOIN c ON p.Id = c.ParentId 
) 
SELECT * FROM c WHERE c.StartingId = 11 

देता

StartingId Id   ParentId Name         Height 
----------- ----------- ----------- ---------------------------------------------- 
11   11   10   Rain Coats        0 
11   10   9   Jackets        1 
11   9   8   Mens Clothing       2 
11   8   NULL  Mens Wear        3 
संबंधित मुद्दे