1

我有以下结构的会员表

GroupID  MemberType MemberID

   G1     user       U1
   G1     group      G2
   G2     user       U2
   G2     group      G3
   G3     group      G1

在这里,我的需要是..需要使用GroupID获取组成员..

对于直接成员,我们可以通过在 where 查询中使用 GroupID 列轻松完成。

但要获得嵌套成员,我们需要递归执行此查询。为此,我使用了以下 CTE 查询。

;with cte as 
(
    select *, groupid as mastergroup,1 as level from mytable 
    union all       
    select t1.memberid, t1.membertype, null, cte.mastergroup, level+1
    from cte 
        inner join mytable t1
            on t1.groupid=cte.memberid
    where cte.membertype='group'
) 
select * from cte
where mastergroup='G1'

好的。如果嵌套组之间没有循环,则工作正常。但就我而言

我以这种方式具有循环结构...G1-->G2-->G3-->G1...所以在这种情况下,我的查询在 CTE 循环中无限期地运行。

任何人都可以帮我解决这个问题吗?......提前谢谢......

4

1 回答 1

0

我不确定下面的解决方案是否适合您,因为它在理论上并不能完全解决循环问题,但实际上它应该可以工作。

它依赖于这样一个事实,即您不能无限循环递归,但您可以将其限制在某个级别 - 在我下面的示例中为 100。这意味着它仍然会通过循环,但只要循环不太长(总链 < 99),它将正常工作并找到所有成员。

declare @mastergroup varchar(10) = 'G1'
declare @maxlevel int = 100

;with cte as 
(
    select groupid, memberid, membertype, 1 as level 
    from mytable1 
    where GroupID = @mastergroup

    union all     

    select t1.groupid, t1.memberid, t1.membertype, cte.level+1 as level
    from cte 
    inner join mytable1 t1
        on t1.groupid = cte.memberid
    and cte.level < @maxlevel
) 
select distinct groupid, memberid, membertype from cte
where MemberID <> @mastergroup
于 2013-10-08T09:05:20.007 回答