SQL-запрос для получения полного пути иерархии - PullRequest
5 голосов
/ 16 сентября 2010

У меня есть таблица с тремя столбцами NodeId, ParentNodeId, NodeName.для каждого узла я хотел бы получить полный путь, такой как «lvl1 / lvl2 / lvl3 ...», где lvl1, lvl2 и lvl3 - имена узловЯ нашел функцию, которая делает это по этой ссылке http://www.sql -server-helper.com / functions / get-tree-path.aspx .но я хотел бы использовать CTE ИЛИ любую другую технику для эффективности.Пожалуйста, дайте мне знать, если это возможно сделать лучше.Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 16 сентября 2010

Вот версия CTE.

declare @MyTable table (
    NodeId int,
    ParentNodeId int,
    NodeName char(4)
)

insert into @MyTable
    (NodeId, ParentNodeId, NodeName)
    select 1, null, 'Lvl1' union all
    select 2, 1, 'Lvl2' union all
    select 3, 2, 'Lvl3'

declare @MyPath varchar(100)

;with cteLevels as (
    select t.NodeId, t.ParentNodeId, t.NodeName, 1 as level
        from @MyTable t
        where t.ParentNodeId is null
    union all
    select t.NodeId, t.ParentNodeId, t.NodeName, c.level+1 as level
        from @MyTable t
            inner join cteLevels c
                on t.ParentNodeId = c.NodeId
)
select @MyPath = case when @MyPath is null then NodeName else @MyPath + '/' + NodeName end
    from cteLevels
    order by level

select @MyPath
4 голосов
/ 16 сентября 2010

Я решил это так, очень похоже на решение Джо.

    with cte (NodeId,NodeName,hierarchyPath)as
(
    select NodeId,NodeName, NodeName
    from Node
    where ParentNodeId is null 
    union all
    select n.NodeId, n.NodeName, CONVERT(varchar(256), cte.hierarchyPath + '/' + n.NodeName)
    from Node n
    join cte on n.ParentNodeId = cte.NodeId
)

select * 
from cte 
order by NodeId
0 голосов
/ 16 сентября 2010

По моему опыту, наиболее эффективным способом было бы добавить дополнительное поле RootNodeID, содержащее идентификатор узла верхнего уровня древовидной структуры.Таким образом, вы можете запросить все узлы во всей трееструктуре очень простым и эффективным способом.

И для построения этой трееструктуры простая рекурсивная функция в вашем приложении должна работать просто отлично.это денормализация, и некоторые люди на самом деле не одобряют эту концепцию, но я узнал из своего профессионального опыта, что это приводит к значительному увеличению производительности, в отличие от сложного сценария t-sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...