Для этого вы использовали бы рекурсивный CTE:
WITH r AS
(SELECT id,
NULL AS parent_id,
CAST(right('000' + CAST(row_number()
OVER (table.id) AS varchar), 3) AS varchar(50))
FROM table WHERE parent IS NULL
UNION ALL
SELECT table.id, table.parent_id,
CAST(r.ord + right('000' + CAST(row_number()
OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
FROM r JOIN table
ON table.parent = r.id)
SELECT id
FROM r
ORDER BY left(ord + '000000000000000000000000000000000', 36)
Обратите внимание, что эта конкретная версия сломается, если какой-либо идентификатор имеет значение больше 999, и сломается, если у вас более 12 уровней. Если это вас беспокоит, вам нужно отрегулировать количество нулей в разных местах.
Возможно, есть лучшие способы, но этот работает.