我编写了一个非常简单的CTE表达式,用于检索用户是成员的所有组的列表。
规则如下:用户可以在多个组中,组可以嵌套,因此一个组可以是另一个组的成员,而且,组也可以相互成为成员,所以组A是组B的成员,组B也是组A的成员。
我的CTE表达式如下,显然会产生无限递归:
;WITH GetMembershipInfo(entityId) AS( -- entity can be a user or group
SELECT k.ID as entityId FROM entities k WHERE k.id = @userId
UNION ALL
SELECT k.id FROM entities k
JOIN Xrelationships kc on kc.entityId = k.entityId
JOIN GetMembershipInfo m on m.entityId = kc.ChildID
)
我找不到一个简单的解决方案来回溯那些我已经记录过的组。
我考虑在CTE中使用一个额外的varchar参数来记录我已访问的所有组的列表,但是使用varchar太粗糙了,不是吗?
有更好的方法吗?