Вы можете использовать рекурсивный cte для этого. Идея состоит в том, чтобы начать с узлов root и пройти по иерархии к листам, конкатенируя путь, как вы go.
with cte as (
select id, cast(caption as nvarchar(max)) caption, parent from mytable where parent is null
union all
select t.id, cast(c.caption + '/' + t.caption as nvarchar(max)), t.parent
from cte c
inner join mytable t on t.parent = c.id
)
select * from cte order by caption
Демонстрация на DB Fiddle :
id | caption | parent
:- | :------ | -----:
1 | A | <em>null</em>
3 | A/a | 1
7 | A/a/aa | 3
2 | B | <em>null</em>
4 | B/b | 2
5 | B/b/bb | 4
6 | C | <em>null</em>
8 | C/c | 6