Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环案例的SQL CTE_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

循环案例的SQL CTE

循环案例的SQL CTE,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有以下结构的会员表 GroupID MemberType MemberID G1 user U1 G1 group G2 G2 user U2 G2 group G3 G3 group G1 在这里,我的需要是。。需要使用GroupID获取组成员 对于直接成员,我们可以通过在where query中使用GroupID列轻松实现 但是为了获得嵌套成员,我们需要递归地执

我有以下结构的会员表

GroupID  MemberType MemberID

   G1     user       U1
   G1     group      G2
   G2     user       U2
   G2     group      G3
   G3     group      G1
在这里,我的需要是。。需要使用GroupID获取组成员

对于直接成员,我们可以通过在where query中使用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循环中无限期运行


有什么能帮我解决这个问题吗?……提前谢谢……

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

它依赖于这样一个事实,即不能无限循环递归,但可以将其限制在某个级别—在下面的示例中,限制为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

检查此解决方案可能会有所帮助。嗨@Pratik谢谢。。它的工作得到了解决这里嗨@Szymon谢谢你的回答。。。我从这里得到了解决办法