Je hebt ons niet verteld hoe je weet of een gebruiker rechten heeft op een bepaalde id. Dat is een noodzakelijke informatie. Ik ga hieronder wat code plaatsen die ervan uitgaat dat je een kolom aan je zoekopdracht toevoegt met de naam hasRights en dat deze kolom een waarde nul heeft als de gebruiker geen rechten heeft en een waarde van één als ze dat wel hebben. Het kan zijn dat je dit moet aanpassen, omdat ik geen gegevens heb om mee te testen, maar hopelijk kom je er dichtbij.
In principe wordt de zoekopdracht gewijzigd om alleen 1 toe te voegen aan het niveau als de gebruiker rechten heeft. Het voegt ook alleen toe aan het sorteerpad als de gebruiker rechten heeft, anders wordt er een lege string toegevoegd. Dus als id's 8 en 9 de enige items zijn waartoe de gebruiker toegang heeft, zou u niveaus 1 en 2 moeten zien en sorteerpaden vergelijkbaar met '5/8/9' in plaats van '5/6/8/9'. Als het je nog steeds niet lukt om het werkend te krijgen, zou het ons enorm helpen als je een voorbeeldschema op SqlFiddle zou plaatsen.
WITH Tree
AS (
SELECT
id,
parent,
0 AS Level,
id AS Root,
hasRights AS HasRights,
CAST(id AS VARCHAR(MAX)) AS Sort,
user_id
FROM SourceTable
WHERE parent IS NULL
UNION ALL
SELECT
st.id,
st.parent,
Level + st.hasRights AS Level,
st.parent AS Root,
st.hasRights AS HasRights,
uh.sort + CASE st.hasRights WHEN 0 THEN '' ELSE '/' + CAST(st.id AS VARCHAR(20)) END AS Sort,
st.user_id
FROM SourceTable AS st
JOIN Tree uh ON uh.id = st.parent
)
SELECT * FROM Tree AS t
JOIN UserTable AS ut ON ut.id = t.user_id AND ut.user_id = '141F-4BC6-8934'
ORDER BY Sort