2014-12-02 32 views
5

我有一個表,如下的所有子:如何獲得的自我引用的表中的每個記錄

 
ID | ChildsID | Name   
-----------------------    
1  NULL  Name1 
2  1   Name2 
3  2   Name3 
4  3   Name4 
5  4   Name5 
6  5   Name6 
7  6   Name7 
8  7   Name8 
9  8   Name9 
10  9   Name10 
11  3   Name11 

現在我想一個查詢,可以得到所有可能的孩子具有至少每個記錄孩子,並返回給我一個像這樣的數據集:

 
ID | ParentID | Name | ParentIDs   
-----------------------------------------    
1  NULL  Name1  11,10,9,8,7,6,5,4,3,2 
2  1   Name2  11,10,9,8,7,6,5,4,3 
3  2   Name3  11,10,9,8,7,6,5,4 
4  3   Name4  10,9,8,7,6,5 
5  4   Name5  10,9,8,7,6 
6  5   Name6  10,9,8,7 
7  6   Name7  10,9,8 
8  7   Name8  10,9 
9  8   Name9  10
+0

Uhm..what孩子..? – Nightmaresux 2014-12-02 10:07:12

+4

使用遞歸CTE。 http://stackoverflow.com/questions/19914472/cte-to-get-all-children-descendants-of-a-parent – 2014-12-02 10:11:17

+0

來自我以前的答案的另一個例子http://stackoverflow.com/questions/26030796/i全職員工主管/ 26030899#26030899 – AK47 2014-12-02 10:18:06

回答

4

使用此查詢。

更新結果:Fiddler Demo

CREATE TABLE TABLE1 (ID INT, ParentID INT, NAME VARCHAR(10)); 
INSERT INTO TABLE1 VALUES(1, NULL, 'Name1'); 
INSERT INTO TABLE1 VALUES(2, 1, 'Name2'); 
INSERT INTO TABLE1 VALUES(3, 2, 'Name3'); 
INSERT INTO TABLE1 VALUES(4, 3, 'Name4'); 
INSERT INTO TABLE1 VALUES(5, 4, 'Name5'); 
INSERT INTO TABLE1 VALUES(6, 5, 'Name6'); 
INSERT INTO TABLE1 VALUES(7, 6, 'Name7'); 
INSERT INTO TABLE1 VALUES(8, 7, 'Name8'); 
INSERT INTO TABLE1 VALUES(9, 8, 'Name9'); 
INSERT INTO TABLE1 VALUES(10, 9, 'Name10'); 
INSERT INTO TABLE1 VALUES(11, 3, 'Name11'); 

    SELECT ID, ParentID , Name, Child = STUFF((
      SELECT ',' + CAST(B.ID AS VARCHAR(100)) FROm TABLE1 AS B 
      WHERE ISNULL(A.ID, 0) < B.ID AND B.ID NOT IN(
       ISNULL((SELECT TOP 1 C.ID FROm TABLE1 AS C 
         WHERE C.ParentID IN (
          SELECT ParentID FROM TABLE1 WHERE ID <= A.ID) 
         ORDER BY C.ID DESC), 0)) 
      ORDER BY B.ID DESC 
      FOR XML PATH (''), type).value('.', 'varchar(max)'), 1,1,'') 
FROm TABLE1 AS A 

老結果:

SELECT ID, ParentID , Name, ParentIDs = STUFF((
    SELECT ',' + CAST(B.ID AS VARCHAR(100)) FROm MyTable AS B 
    WHERE ISNULL(A.ID, 0) < B.ID ORDER BY B.ID DESC FOR XML PATH (''), type).value('.', 
      'varchar(max)'), 1,1,'') 
FROm MyTable AS A 
+1

不是正確的答案。您只是將較高的值指定爲較低值的子元素。 5 - 10,9,8,7,6是孩子。但你的答案顯示 - 11,10,9,8,7,6 – Veera 2014-12-02 10:24:38

+0

@Veera:我已經更新了結果。檢查並回復狀態。 – 2014-12-02 11:12:58

+0

@Kumar非常感謝我的朋友,您的舊查詢與我的理想結果不符,但您的更新正常工作。任何方式謝謝 – Mohsen 2014-12-03 05:31:49

2

你可以嘗試使用這一個:

SELECT a.*,x.ParentIDs 
    FROM YourTable a 
    CROSS APPLY (SELECT STUFF(CAST((SELECT ',' + CONVERT(VARCHAR,b.ID) 
    FROM YourTable b WHERE b.ID > a.ID AND ISNULL(b.ParentID,0) > ISNULL(a.ParentID,0) ORDER BY ID DESC 
    FOR XML PATH(''), TYPE) AS VARCHAR(MAX)),1,1,'') AS ParentIDs) x 
    WHERE x.ParentIDs IS NOT NULL 
+0

非常感謝我的親愛的朋友,它工作良好 – Mohsen 2014-12-03 05:29:12

相關問題