2013-02-13 36 views
7

मैं श्रेणीबद्ध पेड़ तालिकाउपयोग एसक्यूएल CTE तालिका पथ और सभी बच्चों को शामिल करने के लिए

GO 
DROP TABLE #tbl 
GO 
CREATE TABLE #tbl (Id int , ParentId int) 
INSERT INTO #tbl (Id, ParentId) VALUES (0, NULL) 
INSERT INTO #tbl (Id, ParentId) VALUES (1, 0) 
INSERT INTO #tbl (Id, ParentId) VALUES (2, 1) 
INSERT INTO #tbl (Id, ParentId) VALUES (3, 1) 
INSERT INTO #tbl (Id, ParentId) VALUES (4, 2) 
INSERT INTO #tbl (Id, ParentId) VALUES (5, 2) 
INSERT INTO #tbl (Id, ParentId) VALUES (6, 3) 
INSERT INTO #tbl (Id, ParentId) VALUES (7, 3) 
GO 

कौन सा पेड़

0 
+- 1 
    +- 2 
     +- 4 
     +- 5 
    +- 3 
     +- 6 
     +- 7 

निम्नलिखित CTE रिकर्सिव तालिका का उपयोग करने के लिए नक्शे, मैं पथ कैसे प्राप्त कर सकते हैं और निम्नलिखित है चयनित नोड के सभी बच्चे भी। उदाहरण 2 इनपुट के रूप में होने के लिए, मैं कैसे डेटा निम्नलिखित प्राप्त कर सकते हैं

Id, ParentID 
------- 
0, NULL 
1, 0 
2, 1 
4, 2 
5, 2 

मैं जानता हूँ कि मैं बयान

WITH RecursiveTree AS (
    -- Anchor 
    SELECT * 
     FROM #tbl 
     WHERE Id = 2 
    UNION ALL 
     -- Recursive Member 
     SELECT Parent.* 
     FROM 
      #tbl AS Parent 
      JOIN RecursiveTree AS Child ON Child.ParentId = Parent.Id 
) 
SELECT * FROM RecursiveTree 

और साथ निम्नलिखित के साथ (पथ प्राप्त) पेड़ में पार कर सकते हैं (यदि संभव हो आदेश दिया) कैसे गठबंधन करने के लिए इन दोनों आदेशों: बयान के बाद, पेड़ में नीचे पार

WITH RecursiveTree AS (
    -- Anchor 
    SELECT * 
     FROM #tbl 
     WHERE Id = 2 
    UNION ALL 
     -- Recursive Member 
     SELECT Child.* 
     FROM 
      #tbl AS Child 
      JOIN RecursiveTree AS Parent ON Child.ParentId = Parent.id 
) 
SELECT * FROM RecursiveTree 

प्रश्न (सभी बच्चों प्राप्त) एक में?

+1

+1 के मिलन का उपयोग अच्छा विवरण, DDL, DML और परीक्षण डाटा उपलब्ध कराने के लिए। –

उत्तर

4

बस इन दो चयन

SQLFiddle demo

WITH RecursiveTree AS (
    -- Anchor 
    SELECT * 
     FROM #tbl 
     WHERE Id = 2 
    UNION ALL 
     -- Recursive Member 
     SELECT Parent.* 
     FROM 
      #tbl AS Parent 
      JOIN RecursiveTree AS Child ON Child.ParentId = Parent.Id 
), 
RecursiveTree2 AS 
(
    -- Anchor 
    SELECT * 
     FROM #tbl 
     WHERE Id = 2 
    UNION ALL 
     -- Recursive Member 
     SELECT Child.* 
     FROM 
      #tbl AS Child 
      JOIN RecursiveTree2 AS Parent ON Child.ParentId = Parent.id 
) 
select * from 
(
SELECT * FROM RecursiveTree 
union 
SELECT * FROM RecursiveTree2 
) t 
order by id