Не сте ни казали как знаете дали даден потребител има права върху даден идентификатор. Това е необходима информация. Ще сложа код по-долу, който предполага, че добавяте колона към вашата заявка, наречена hasRights и че тази колона ще има нулева стойност, ако потребителят няма права и стойност единица, ако има. Може да се наложи да коригирате това, тъй като нямам данни за тестване, но се надявам, че ще ви доближи.
По принцип заявката се променя, за да добави само 1 към нивото, ако потребителят има права. Той също така добавя само към пътя за сортиране, ако потребителят има права, в противен случай се добавя празен низ. Така че, ако идентификатори 8 и 9 са единствените елементи, до които потребителят има достъп, трябва да видите нива 1 и 2 и пътища за сортиране, подобни на "5/8/9", а не на "5/6/8/9". Ако все още не можете да го накарате да работи, ще ни помогне изключително много, ако публикувате примерна схема в 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