Du har ikke fortalt os, hvordan du ved, om en bruger har rettigheder til et givet id. Det er en nødvendig oplysning. Jeg vil indsætte noget kode nedenfor, der antager, at du tilføjer en kolonne til din forespørgsel kaldet hasRights og at denne kolonne vil have en værdi på nul, hvis brugeren ikke har rettigheder, og en værdi på én, hvis de har. Du skal muligvis justere dette, da jeg ikke har nogen data at teste med, men forhåbentlig vil det bringe dig tæt på.
Grundlæggende ændres forespørgslen til kun at tilføje 1 til niveauet, hvis brugeren har rettigheder. Det tilføjer også kun sorteringsstien, hvis brugeren har rettigheder, ellers tilføjes en tom streng. Så hvis id 8 og 9 er de eneste elementer, brugeren har adgang til, bør du se niveauer 1 og 2 og sortere stier svarende til '5/8/9' i stedet for '5/6/8/9'. Hvis du stadig ikke er i stand til at få det til at fungere, ville det hjælpe os enormt, hvis du postede et eksempelskema på SqlFiddle.
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