1

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

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

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

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

我现在拥有的是:

CREATEFUNCTION [DBO].[FUNC_ALL_CHILDGROUPS] (@GROUPID INT)
RETURNS TABLE
AS
RETURN (
    WITH ALLGROUPS (GROUPID, GROUPFATHER) AS 
    (
        SELECT GROUPID, GROUPFATHER 
        FROM 
            TBL_GROUPS 
        WHERE GROUPID = @GROUPID 

        UNION ALL 

        SELECT TBL_GROUPS.GROUPID, TBL_GROUPS.GROUPFATHER 
        FROM 
            TBL_GROUPS 
            INNER JOIN ALLGROUPS 
            ON TBL_GROUPS.GROUPFATHER = ALLGROUPS.GROUPID
    )
SELECT * FROM ALLGROUPS
4

1 回答 1

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
于 2012-09-16T10:23:21.743 回答