TSQL CTE: Wie vermeide ich das zirkuläre Überqueren?
Ich habe einen sehr einfachen CTE-Ausdruck geschrieben, der eine Liste aller Gruppen abruft, zu denen ein Benutzer gehört.
Die Regeln lauten wie folgt: Ein Benutzer kann mehreren Gruppen angehören, und Gruppen können verschachtelt sein, sodass eine Gruppe Mitglied einer anderen Gruppe sein kann. Außerdem können Gruppen Mitglied einer anderen Gruppe sein, sodass Gruppe A Mitglied der Gruppe ist B und Gruppe B ist auch Mitglied der Gruppe A.
Mein CTE geht so und es ergibt sich offensichtlich eine unendliche Rekursion:
;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
)
Ich kann keine einfache Lösung finden, um die bereits aufgezeichneten Gruppen zurück zu verfolgen.
Ich habe darüber nachgedacht, einen zusätzlichen varchar-Parameter im CTE zu verwenden, um eine Liste aller von mir besuchten Gruppen aufzuzeichnen, aber varchar ist einfach zu grob, nicht wahr?
Gibt es einen besseren Weg?