Sql Server根据父节点对具有层次关系的表进行分组

时间:2018-02-06 09:11:36

标签: tsql tree parent-child hierarchical

我有一个表格,其中的产品具有等级关系 - 例如,有一排苹果包含5公斤苹果,一排儿童排有1公斤苹果。这种关系如下:

Id   ContainsId      Name

8792    4567     Bag - 5kg apples
4567    NULL        1 kg apples

我需要的是对每个分层系列中的产品进行分组,以便我可以将它们显示在彼此相邻的列表中。结果应如下所示:

 FamilyId   Id        Name
   8792    8792   Bag - 5kg apples
   8792    4567   1kg apples

这个家庭可以有两个以上的成员。

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

使用递归CTE可以这样做

DECLARE @tbl TABLE (Id INT, ContainsId INT, [Name] NVARCHAR(100))
INSERT INTO @tbl
(Id, ContainsId, [Name])
VALUES
(8792,4567,'Bag - 5kg apples')
,(4567,5555,'1 kg apples')
,(5555,7878,'Some Oranges') --Added some extra items
,(7878,NULL,'Fish Fingers') --Added some extra items

;WITH cteX
AS
(   SELECT
        T.Id, T.ContainsId,  T.[Name], FamilyId = T.Id
    FROM
        @tbl    T
    WHERE
        T.Id = 8792
    UNION ALL
    SELECT
          T1.Id
        , T1.ContainsId
        , T1.[Name]
        , R.FamilyId
    FROM
        @tbl        T1
    INNER JOIN
        cteX        R ON    R.ContainsId = T1.Id
)
SELECT T.FamilyId
     , T.Id
     , T.Name
FROM cteX T

输出

FamilyId    Id      Name
8792        8792    Bag - 5kg apples
8792        4567    1 kg apples
8792        5555    Some Oranges
8792        7878    Fish Fingers