我正在尝试为组和子组定义一个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问题所以我会在两个类别中发布。
感谢您的参与
答案 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
列是额外奖励,告诉您每行所在的层次结构中的级别。