Здравствуйте, 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]
То есть сортировка по уровню, содержащему узлу и атрибуту элемента (в моем случае — имени).
Если надо, мого скинуть код.