Bạn chưa cho chúng tôi biết cách bạn biết liệu người dùng có quyền đối với một id nhất định hay không. Đó là một thông tin cần thiết. Tôi sẽ đặt một số mã bên dưới giả sử bạn thêm một cột vào truy vấn của mình có tên là hasRights và cột này sẽ có giá trị bằng 0 nếu người dùng không có quyền và giá trị là một nếu họ có. Bạn có thể cần phải chỉnh sửa điều này, vì tôi không có dữ liệu để kiểm tra nhưng hy vọng nó sẽ giúp bạn thực hiện được.
Về cơ bản, truy vấn được thay đổi để chỉ thêm 1 vào cấp nếu người dùng có quyền. Nó cũng chỉ thêm vào đường dẫn sắp xếp nếu người dùng có quyền, nếu không thì một chuỗi trống sẽ được thêm vào. Vì vậy, nếu id 8 và 9 là các mục duy nhất mà người dùng có quyền truy cập, bạn sẽ thấy cấp độ 1 và 2 và sắp xếp các đường dẫn tương tự như '5/8/9' thay vì '5/6/8/9'. Nếu bạn vẫn không thể làm cho nó hoạt động, sẽ giúp chúng tôi rất nhiều nếu bạn đăng một lược đồ mẫu lên 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