Локи, у меня был похожий запрос, но он сортировался не по названию, как я хотел, а по коду - была пятница, и я был перегружен.
В любом случае, выполнение вашего запроса дало мне ошибку, необходимо привести; Я должен был изменить это следующим образом:
WITH tree (id, parentid, name, code) AS
(
SELECT id, ofs.ParentID, ofs.name, CAST(ofs.name as varchar(255))
FROM OrganizationFeatures ofs
WHERE ofs.ParentID IS NULL
UNION ALL
SELECT ofs.id, ofs.ParentID, ofs.name, CAST(tree.code+'/'+ofs.name as varchar(255))
FROM OrganizationFeatures ofs
JOIN tree ON tree.ID = ofs.ParentID
)
select * from tree order by code
Проблема в том, что необходимо привести к varchar, несмотря на то, что зовут varchar. Вполне возможно, что varchar (255) недостаточно с большими деревьями.
Итак, я сделал версию, в которой вышеупомянутая проблема не так велика:
WITH tree (id, parentid, name, code) AS
(
SELECT id, ofs.ParentID, ofs.name,
CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255))
FROM OrganizationFeatures ofs
WHERE ofs.ParentID IS NULL
UNION ALL
SELECT ofs.id, ofs.ParentID, ofs.name,
CAST(tree.code +'/' + CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) as varchar(255))
FROM OrganizationFeatures ofs
JOIN tree ON tree.ID = ofs.ParentID
)
select * from tree order by code
Но мне не нравится такое решение, где необходимо разыграть. Есть ли лучшее решение?