ユーザーがメンバーであるすべてのグループのリストを取得する非常に単純な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を使用するのはあまりにも粗雑ですよね?
もっと良い方法はありますか?