Nie powiedziałeś nam, skąd wiesz, czy użytkownik ma prawa do danego identyfikatora. To niezbędna informacja. Zamieszczę poniżej kod, który zakłada, że dodajesz do zapytania kolumnę o nazwie hasRights i że ta kolumna będzie miała wartość zerową, jeśli użytkownik nie ma uprawnień, a wartość równą, jeśli ma. Być może będziesz musiał to poprawić, ponieważ nie mam danych do przetestowania, ale mam nadzieję, że zbliżysz się do tego.
Zasadniczo zapytanie jest zmieniane tak, aby dodać tylko 1 do poziomu, jeśli użytkownik ma uprawnienia. Dodaje również do ścieżki sortowania tylko wtedy, gdy użytkownik ma uprawnienia, w przeciwnym razie dodawany jest pusty ciąg. Jeśli więc identyfikatory 8 i 9 są jedynymi elementami, do których użytkownik ma dostęp, powinieneś zobaczyć poziomy 1 i 2 oraz posortować ścieżki podobne do „5/8/9” zamiast „5/6/8/9”. Jeśli nadal nie możesz go uruchomić, ogromnie pomogłoby nam opublikowanie przykładowego schematu na 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