У меня есть следующие таблицы в SQL Server:Рекурсивный CTE в SQL Server последний узел
| id | Name | ParentId |
| 1 | world | Null |
| 2 | Region | 1 |
| 3 | Country | 2 |
| 4 | State | 3 |
| 5 | City | 4 |
| 6 | Street | 5 |
Число иерархий не зафиксировано.
Мне нужен выход в виде улицы, города, штата, страны, региона, мира.
Запуск следующий код SQL:
WITH Hierarchy (ChildId, ChildName, ParentId, Childs) AS
(
SELECT
Id, Name, ParentId, CAST('' AS VARCHAR(MAX))
FROM
UserType AS LastGeneration
WHERE
Id NOT IN (SELECT COALESCE(ParentId, 0) FROM UserType)
UNION ALL
SELECT
PrevGeneration.Id, PrevGeneration.Name, PrevGeneration.ParentId,
CAST(CASE WHEN Child.Childs = ''
THEN(CAST(Child.ChildName AS VARCHAR(MAX)))
ELSE(Child.Childs + ', ' + CAST(Child.ChildName AS VARCHAR(MAX)))
END AS VARCHAR(MAX))
FROM
UserType AS PrevGeneration
INNER JOIN
Hierarchy AS Child ON PrevGeneration.Id = Child.ParentId
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)
Это возвращает выход:
Street, City, State, Country, Region
Что мне нужно, чтобы добавить к рекурсии, чтобы получить последний узел?
Заранее благодарен!
Пройдя от листьев до корня, вы получите много дубликатов (из-за того, что у одного родителя может быть много детей) - лучше использовать подход сверху вниз (1-й бит в ответе Эд). В вашем коде, я думаю, вам нужно выполнить 'PrevGeneration.Name' вместо' Child.ChildName'. При объединении дочернего имени вы не оставляете никаких шансов на уровень корня, поскольку он не является дочерним для какой-либо строки. –