Re: Эмуляция иерархии на SQL
От: Vaso Австралия  
Дата: 31.07.09 05:51
Оценка:
Здравствуйте, naf2000, Вы писали:


N>требуется написать запрос, упорядочивающий записи по иерархии, а среди записей одной ветки иерархии должно быть упорядочивание по (IsGroup,Name), например:


N>Группа 1

N>__Группа 1.1
N>____Товар 1.1.1
N>____Товар 1.1.2
N>__Товар 1.2
N>__Товар 1.3
N>Группа 2
N>__Группа 2.1
N>__Группа 2.2

N>вот такой запрос, дает иерархию, но не дает упорядоченности внутри веток иерархии:

N>
SELECT g.ID, g.Name, g.ISGROUP, count(g2.ID) AS glevel
N>FROM GOOD g
N>LEFT JOIN GOOD g2 ON (g.LEFTBOUND BETWEEN g2.LEFTBOUND AND g2.RIGHTBOUND)
N>GROUP BY g.ID, g.Name, g.ISGROUP, g.LEFTBOUND
N>ORDER BY g.LEFTBOUND

N>поле glevel отвечает за уровень вложенности записи

Я не так давно реализовал иерархии в SQL 2005 на CTE.
Вот кусок кода
create function dbo.fn_get_all_custom_hierarchy_nodes_recursive(@hierarchy_id int, @level int)
returns table
as
return
with tree ([id], [level], [name], [parent_id], [top_node_id], [description], path_symbolic, path_numeric) as (
    select    [id]
            , [level]
            , [name]
            , [parent_id]
            , [id] as [top_node_id]
            , [description]
            , convert(nvarchar(max), [name]) as path_symbolic
            , convert(nvarchar(max), [id]) as path_numeric
    from        dbo.custom_hierarchy_nodes
    where        [hierarchy_id] = @hierarchy_id
                and [level] = @level

    union all

    select    n.[id]
            , n.[level]
            , n.[name]
            , n.[parent_id]
            , t.[top_node_id]
            , n.[description]
            , t.path_symbolic + N'/' + n.[name] as path_symbolic
            , t.path_numeric + N'/' + convert(nvarchar(max), n.[id]) as path_numeric
    from        dbo.custom_hierarchy_nodes n
            , tree t
    where        n.parent_id = t.[id]
)
select        id
            , [level]
            , [name]
            , [parent_id]
            , [top_node_id]
            , [description]
            , path_symbolic
            , path_numeric
from        tree;


а вот запрос с сортировкой по имени (в вашем случае отсортируете по другому атрибуту)
select        *
from        dbo.fn_get_all_custom_hierarchy_nodes_recursive(1,1)
order by    [level]
            , parent_id
            , [name]


То есть сортировка по уровню, содержащему узлу и атрибуту элемента (в моем случае — имени).

Если надо, мого скинуть код.
Vaso
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.