SQL树中的多个递归

时间:2012-09-15 16:22:07

标签: sql-server-2008 tree common-table-expression

我正在使用SQL Server 2008.我有一个表格,其中详细说明了使用两个列的组{ - 1}}和userid int(我们称之为groupid int)。每个用户都可以访问树中任何级别的多个组。

第二个组表定义了一个包含三列的树结构 - tbl_accessgroupid int,groupname nvarchar(32)(顶级组的值为-1 {{1} }) - 让我们称之为groupfather int

我正在尝试编写一个给定groupfather的函数,该函数将查找用户可以在tbl_groups中访问的所有组,并且对于每个组,它将查找所有子节点,并返回用户有权访问的所有组的组合不同列表。)

我尝试过使用CTE,但这只能让我得到一个组的所有子节点,而不是所有组的所有子节点。

我现在拥有的是:

userid

1 个答案:

答案 0 :(得分:2)

您可以使用递归CTE,对于您的功能,您可以使用以下查询:

DECLARE @tbl_access TABLE (userid INT, groupid INT)
DECLARE @tbl_groups TABLE (groupid INT, groupfather INT)

INSERT  @tbl_access 
VALUES 
(1, 2),
(1, 3),
(2, 1),
(2, 4)

INSERT  @tbl_groups
VALUES  
(1, -1),
(2, 1),
(3, -1),
(4, 2),
(5, 4)

DECLARE @UserID INT = 1

;WITH cte AS (

    SELECT  a.*
    FROM    @tbl_groups a
    JOIN    @tbl_access c ON
            c.userid = @UserID
    AND     c.groupid = a.groupid

    UNION   ALL

    SELECT  b.*
    FROM    @tbl_groups b
    JOIN    cte d ON
            d.groupid = b.groupfather
)

SELECT  DISTINCT groupid
FROM    cte