SQL中的递归分层数据表

时间:2012-10-30 15:32:49

标签: sql sql-server database tsql

  

可能重复:
  Simplest way to do a recursive self-join in SQL Server?

我必须在SQL中创建一个包含项目/产品组的表。制作的每个新组都将在预定义组或之前形成的组之一下制作。我想将所有这些数据保存在SQL表中。到目前为止,我已经创建了一个这样的表:

  • 组ID
  • 群组名称
  • Group Under(这将存储该组来自的组的ID

但这只能指代下一个级别,我如何才能知道谁是这个群体的超级父母。

例如:

  • 我有小组A, B, C
  • A还有其他子组A1, A2, A3
  • A1还有其他子组A11, A12, A13

我是否会从AA11A22获得有关超级母群的信息,例如A33

如果问题不明确,请告诉我。

1 个答案:

答案 0 :(得分:1)

假设T-SQL和MSSQLServer(您没有指定),并且假设您的Group表看起来像这样:

Id | Name | ParentId
---+------+---------
 1 | A    | NULL
 2 | B    | NULL
 3 | C    | NULL
 4 | A1   | 1
 5 | A2   | 1
 6 | A3   | 1
 7 | A11  | 4
 8 | A12  | 4
 9 | A13  | 4

您可以使用以下递归CTE查找给定组的顶级,例如'A12':

WITH [Group](Id, Name, ParentId) AS
(
    SELECT 1, 'A'  , NULL UNION
    SELECT 2, 'B'  , NULL UNION
    SELECT 3, 'C'  , NULL UNION
    SELECT 4, 'A1' , 1    UNION
    SELECT 5, 'A2' , 1    UNION
    SELECT 6, 'A3' , 1    UNION
    SELECT 7, 'A11', 4    UNION
    SELECT 8, 'A12', 4    UNION
    SELECT 9, 'A13', 4

), q AS 
(
    SELECT  
        *
    FROM    
        [Group]
    WHERE
        [Name] = 'A12' -- Given 'A12' as the child
    UNION ALL
    SELECT  
        g.*
    FROM
        [Group] g
    JOIN    
        q
        ON      
        q.ParentId = g.Id
    )
SELECT  
    *
FROM
    q
WHERE
    ParentId IS NULL

此查询返回:

Id | Name | ParentId
---+------+---------
 1 | A    | NULL