【问题标题】:Select all users from subgroups in T-SQL query [duplicate]从 T-SQL 查询中的子组中选择所有用户 [重复]
【发布时间】:2019-10-24 18:28:09
【问题描述】:

我有一个 SQL Server 表,其中包含我用来在应用程序中定义用户权限的组和子组。我想要完成的是根据分配给组的已用 id 从所有子组中选择所有用户 id。

我已尝试使用此查询,但它仅显示一级子组用户。

SET @UserIds =
    ISNULL(
        STUFF((SELECT ',' + CAST(tbl.UserID AS VARCHAR(MAX)) 
               FROM 
                   (SELECT grpUser.UserId AS UserID
                    FROM dbo.GroupUser grpUser
                    INNER JOIN (SELECT subGrp.Id, subGrp.GroupName
                                FROM dbo.Groups grp
                                INNER JOIN dbo.GroupUser guser ON grp.Id = guser.GroupId
                                                               AND guser.UserId = @UserId
                                INNER JOIN dbo.Groups subGrp ON grp.Id = subGrp.ParentGroupId) tbl ON grpUser.GroupId = tbl.Id) AS tbl
                FOR XML PATH('')), 1, 1, ''), '')

我正在努力获取所有子组中的用户 ID。未定义子组的数量。有没有办法在 sql 中做或者我应该把这部分转移到应用程序端?谢谢你的建议。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    最后我想出了这段代码。谢谢你的提示。

    declare @UserGroupId int;
           Set @UserGroupId = (Select GroupId from GroupUser gu 
                              left join dbo.Groups gr on gu.GroupId = gr.id
                              where UserId = @UserId and gr.IsDeleted = 0)
    
           declare @UsersGroups  Table (
           Id int not null,
           GroupName nvarchar(50) not null
            )
    
            ;WITH grp AS
            (
                SELECT Id, GroupName
    
                FROM Groups
                WHERE ParentGroupId = 1
                UNION ALL
                SELECT g.Id, g.GroupName
                FROM Groups g
                INNER JOIN dbo.GroupUser guser ON g.Id = guser.GroupId
                INNER JOIN grp ON g.ParentGroupId = grp.Id  
            )
    
            Insert into @UsersGroups    
            SELECT Id, GroupName
            FROM grp
    
            SET @UserIds =  ISNULL(STUFF(( SELECT   ',' + CAST(tbl.UserID AS VARCHAR(max)) FROM ( 
                                SELECT grpUser.UserId AS UserID FROM    dbo.GroupUser grpUser
                                INNER   JOIN ( SELECT * FROM @UsersGroups
                                ) tbl ON grpUser.GroupId = tbl.Id
                                ) AS tbl FOR XML PATH('') ), 1, 1, ''), '')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-30
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 2014-02-16
      相关资源
      最近更新 更多