1

私は SQL Server 2008 を使用しています。2 つの列を持つグループへのユーザーアクセスの詳細を示すテーブルがuserid intありgroupid intますtbl_access。各ユーザーは、ツリーの任意のレベルで複数のグループにアクセスできます。

3 つの列を持つツリー構造を定義するグループの 2 番目のテーブルgroupid intがありgroupfather intます。groupfathertbl_groups

useridを指定すると、関数は でユーザーがアクセスできるすべてのグループを検索し、グループtbl_accessごとにすべての子ノードを見つけて、ユーザーがすべてのグループの結合された個別のリストを返す関数を作成しようとしています。にアクセスできます)。

CTE を使用してみましたが、すべてのグループのすべての子ノードではなく、1 つのグループのすべての子ノードを取得することしかできませんでした。

私が今持っているのは:

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 に答える