आपने हमें यह नहीं बताया कि आप कैसे जानते हैं कि किसी उपयोगकर्ता के पास दी गई आईडी पर अधिकार हैं या नहीं। यह एक आवश्यक जानकारी है। मैं नीचे कुछ कोड डालने जा रहा हूं जो मानता है कि आप hasRights नामक अपनी क्वेरी में एक कॉलम जोड़ते हैं और यह कि यदि उपयोगकर्ता के पास अधिकार नहीं हैं तो इस कॉलम का शून्य मान होगा और यदि वे ऐसा करते हैं तो एक का मान होगा। आपको इसे संशोधित करने की आवश्यकता हो सकती है, क्योंकि मेरे पास परीक्षण करने के लिए कोई डेटा नहीं है, लेकिन उम्मीद है कि यह आपको करीब लाएगा।
मूल रूप से, यदि उपयोगकर्ता के पास अधिकार हैं तो क्वेरी को केवल स्तर में 1 जोड़ने के लिए बदल दिया जाता है। यदि उपयोगकर्ता के पास अधिकार हैं तो यह केवल सॉर्ट पथ में जोड़ता है, अन्यथा एक खाली स्ट्रिंग जोड़ दी जाती है। इसलिए, यदि आईडी 8 और 9 केवल वे आइटम हैं जिन तक उपयोगकर्ता की पहुंच है, तो आपको 1 और 2 के स्तर देखना चाहिए और '5/6/8/9' के बजाय '5/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