a_horse_with_no_name के उत्तर पर विस्तार करते हुए, यह दिखाता है कि SQL सर्वर के पुनरावर्ती CTE के कार्यान्वयन का उपयोग कैसे करें (पुनरावर्ती एकल-रिकॉर्ड क्रॉस लागू ) प्रश्न में सटीक आउटपुट देने के लिए row_number() के संयोजन में।
declare @t table(id int,parentId int,name varchar(20))
insert @t select 1, 0 ,'Category1'
insert @t select 2, 0, 'Category2'
insert @t select 3, 1, 'Category3'
insert @t select 4 , 2, 'Category4'
insert @t select 5 , 1, 'Category5'
insert @t select 6 , 2, 'Category6'
insert @t select 7 , 3, 'Category7'
;
WITH tree (id, parentid, level, name, rn) as
(
SELECT id, parentid, 0 as level, name,
convert(varchar(max),right(row_number() over (order by id),10)) rn
FROM @t
WHERE parentid = 0
UNION ALL
SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
FROM @t c2
INNER JOIN tree ON tree.id = c2.parentid
)
SELECT *
FROM tree
ORDER BY cast('/' + RN + '/' as hierarchyid)
ईमानदारी से कहूं तो, ट्री "पथ" बनाने के लिए स्वयं आईडी का उपयोग करना काम करेगा, क्योंकि हम सीधे आईडी द्वारा ऑर्डर कर रहे हैं, लेकिन मुझे लगा कि मैं row_number() फ़ंक्शन में फिसल जाऊंगा।