That's not easy but not hard either.with RecursionCTE (RecordID,ParentRecordID,SortOrder,Name) as ( select RecordID,ParentRecordID,cast(RecordID as varchar(10)),Name from Sample1 where ParentRecordID = 0 union all select R1.RecordID, R1.ParentRecordID, R2.SortOrder + '/' + cast(RecordID as varchar(10)), R1.Name from Sample1 as R1 join RecursionCTE as R2 on R1.ParentRecordID = R2.RecordID )select * from RecursionCTE order by SortOrder