Anda belum memberi tahu kami bagaimana Anda tahu apakah pengguna memiliki hak atas id yang diberikan. Itu adalah informasi yang diperlukan. Saya akan meletakkan beberapa kode di bawah ini yang mengasumsikan Anda menambahkan kolom ke kueri Anda yang disebut hasRights dan kolom ini akan memiliki nilai nol jika pengguna tidak memiliki hak dan nilai satu jika memiliki hak. Anda mungkin perlu mengubah ini, karena saya tidak memiliki data untuk diuji, tetapi mudah-mudahan ini akan membuat Anda dekat.
Pada dasarnya, kueri diubah menjadi hanya menambahkan 1 ke level jika pengguna memiliki hak. Itu juga hanya menambah jalur pengurutan jika pengguna memiliki hak, jika tidak, string kosong akan ditambahkan. Jadi, jika id 8 dan 9 adalah satu-satunya item yang dapat diakses pengguna, Anda akan melihat level 1 dan 2 dan mengurutkan jalur yang mirip dengan '5/8/9' daripada '5/6/8/9'. Jika Anda masih tidak bisa membuatnya bekerja, itu akan sangat membantu kami jika Anda memposting contoh skema di 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