我正在使用SQL Server 2008.我有一个表格,其中详细说明了使用两个列的组{ - 1}}和userid int
(我们称之为groupid int
)。每个用户都可以访问树中任何级别的多个组。
第二个组表定义了一个包含三列的树结构 - tbl_access
,groupid int
,groupname nvarchar(32)(顶级组的值为-1 {{1} }) - 让我们称之为groupfather int
。
我正在尝试编写一个给定groupfather
的函数,该函数将查找用户可以在tbl_groups
中访问的所有组,并且对于每个组,它将查找所有子节点,并返回用户有权访问的所有组的组合不同列表。)
我尝试过使用CTE,但这只能让我得到一个组的所有子节点,而不是所有组的所有子节点。
我现在拥有的是:
userid
答案 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