0

可能重复:
在 SQL Server 中进行递归自联接的最简单方法?

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

  • 组 ID
  • 组的名字
  • Group Under(这将存储该组所属的组的ID

但这只能指下一个层次,我怎么知道谁是这个组的超级家长。

例如:

  • 我有团体A, B, C
  • A有更多的子群A1, A2, A3
  • A1有进一步的子群,A11, A12, A13

我将获得有关超级父母组的信息,即A来自A11A22A33

如果问题不清楚,请告诉我..

4

1 回答 1

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
于 2012-10-30T16:20:50.393 回答