TSQL CTE: Jak uniknąć przechodzenia cyklicznego?
Napisałem bardzo proste wyrażenie CTE, które pobiera listę wszystkich grup, których członkiem jest użytkownik.
Zasady są następujące: użytkownik może być w wielu grupach, a grupy mogą być zagnieżdżone, tak aby grupa mogła być członkiem innej grupy, a ponadto grupy mogą być wspólnymi członkami innej grupy, więc grupa A jest członkiem grupy B i grupa B jest również członkiem grupy A.
Mój CTE idzie tak i oczywiście daje nieskończoną rekursję:
;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
)
Nie mogę znaleźć łatwego rozwiązania do śledzenia grup, które już nagrałem.
Myślałem o użyciu dodatkowego parametru varchar w CTE, aby zapisać listę wszystkich grup, które odwiedziłem, ale używanie varchar jest po prostu zbyt prymitywne, prawda?
Czy jest lepszy sposób?