Это случай для рекурсивного CTE. Я предполагаю, что ваши ключи на самом деле varchar, поскольку они не представляют числовые значения - если нет, то обновите согласно моему последнему фрагменту.
Это создаст тестовые данные. вам нужна только ваша таблица учетных записей, а не ваша древовидная таблица
create table #account(parent_id varchar(10), id varchar(10))
insert #account values ('1','10'),('1','20'),('1','30'),('1','40'),('10','101'),('20','201'),('30','301')
,('30','302'),('40','401'),('40','402'),('401','4011'),('401','4012'),('4012','40121')
Теперь ваш рекурсивный запрос, сначала найдите все строки верхнего уровня (parent = 1), затем найдите все дочерние элементы, создавая составной путь по ходу
;with tree as (
select parent_id, id, convert(varchar(100),id) as idPath, 1 as depth
from #account
where parent_id=1
union all
select a.parent_id, a.id, convert(varchar(100),idPath+a.id) as idPath, depth+1 as depth
from #account a
join tree on tree.id=a.parent_id
)
select parent_id, id, depth from tree order by idpath
Если идентификаторы на самом деле являются целочисленными типами данных, измените конкатенацию на
convert(varchar(100),convert(varchar(10),idPath)+convert(varchar(10),a.id)) as idPath