循环案例的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谢谢你的回答。。。我从这里得到了解决办法