sql中的父/子关系

时间:2011-12-07 17:07:37

标签: asp.net tsql database-design nested

我正在尝试为组和子组定义一个sql表,到目前为止我的设计如下

groupID groupname       parentgroupID
1       group1          null
2       group2          null
3       subgroup1.1     1
4       subgroup1.1.1   3

我认为我走在正确的轨道上。现在我想检索子组1.1.1的数据,以便能够在商务层中显示它

group1>子组1.1>小组1.1.1

我是否应该在tsql中执行此操作,或者我想在asp.net中执行循环以获取所有可用的父组?

这个问题是sql和asp.net问题所以我会在两个类别中发布。

感谢您的参与

1 个答案:

答案 0 :(得分:3)

你可以解决这个问题 - 在SQL Server 2005或更新版上提供递归CTE:

-- define a CTE (Common Table Expression) with a name
;WITH groups AS
(
    -- define the "anchor" - those top-level rows
    SELECT 
        GroupID, GroupName, 
        CAST(NULL AS INT) AS 'ParentGroupID', 1 AS 'Level',
        CAST('# ' + GroupName AS VARCHAR(1000)) AS 'Breadcrumb'
    FROM @test
    WHERE ParentGroupID IS NULL

    -- recursive join - joins "child" rows to "parent" rows already in the result set       
    UNION ALL

    SELECT 
       t2.GroupID, t2.GroupName, t2.ParentGroupID, g.Level + 1 AS 'Level',
       CAST(g.Breadcrumb + ' > ' + t2.GroupName AS VARCHAR(1000))
    FROM @test t2
    INNER JOIN groups g ON t2.ParentGroupID = g.GroupID  -- join back to the CTE
)
SELECT * 
FROM groups

这应该给你这样的结果:

GroupID  GroupName        ParentGroupID  Level  Breadcrumb
  1       group1             NULL          1     # group1
  2       group2             NULL          1     # group2
  3       subgroup1.1         1            2     # group1 > subgroup1.1
  4       subgroup1.1.1       3            3     # group1 > subgroup1.1 > subgroup1.1.1

任何其他格式都应该在您的前端(Web,客户端/服务器)中完成。

Level列是额外奖励,告诉您每行所在的层次结构中的级别。