Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Иерархический запрос (сортировка) / 3 сообщений из 3, страница 1 из 1
20.04.2020, 20:06
    #39949099
Damir102
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос (сортировка)
Доброго времени суток.

Имеется таблица в которой хранятся данные дерева (родитель-потомок).
Написал простую рекурсию с выводом результата в иерархий, все работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
declare @TT table (level int, ParentID int, ChildID int)
insert into @TT(level,ParentID,ChildID) values( 1,172455, 144461)
insert into @TT(level,ParentID,ChildID) values( 1,172455, 152468)
insert into @TT(level,ParentID,ChildID) values( 1,172455, 210049)
insert into @TT(level,ParentID,ChildID) values( 2,144461, 210049)
insert into @TT(level,ParentID,ChildID) values( 2,144461, 121212)
insert into @TT(level,ParentID,ChildID) values( 2,144461, 158030)
insert into @TT(level,ParentID,ChildID) values( 2,144461, 180465)
insert into @TT(level,ParentID,ChildID) values( 2,152468, 56390)
insert into @TT(level,ParentID,ChildID) values( 2,152468, 215453)
insert into @TT(level,ParentID,ChildID) values( 3,158030, 210049)
insert into @TT(level,ParentID,ChildID) values( 3,180465, 210049)
insert into @TT(level,ParentID,ChildID) values( 3,56390, 210049)
insert into @TT(level,ParentID,ChildID) values( 3,215453, 210049)
;

--select * from @TT;

WITH s ([Level], [ParentID], [ChildID], lvl, hid , [name] ) AS
 (
    SELECT [Level], [ParentID],
     [ChildID] [ChildID],
      0,
      CAST('/'+CAST(ChildID AS VARCHAR(MAX))+'/' AS hierarchyid)
    , 'asdf'  [name] 
     FROM  @TT t
       WHERE  [Level]=1
    UNION ALL
    SELECT t.[Level], t.[ParentID],
    t.[ChildID] [ChildID], 
    s.lvl + 1, 
    CAST(CAST(s.hid AS varchar(MAX)) + CAST(t.ChildID as varchar(MAX)) + '/' as hierarchyid)--, 
    , 'asdf'  [name]       
    FROM @TT  t INNER JOIN s ON s.[ChildID]=t.[ParentID]
)

SELECT [Level], [ParentID], [ChildID],   hid, 
lvl ,replicate('___', lvl)+[name] [name]
  FROM s   ORDER BY  hid 


К примеру, нам нужно найти по потомку все выше расположенные родители, изменяем немного рекурсивный запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH s ([Level], [ParentID], [ChildID], lvl, hid , [name] ) AS
 (
    SELECT [Level], [ParentID],
     [ChildID] [ChildID],      0,
      CAST('/'+CAST(ChildID AS VARCHAR(MAX))+'/' AS hierarchyid)
    , 'asdf'  [name] 
     FROM  @TT t
       WHERE  ChildID=210049
    UNION ALL
    SELECT t.[Level], t.[ParentID],
    t.[ChildID] [ChildID], 
    s.lvl + 1, 
    CAST(CAST(s.hid AS varchar(MAX)) + CAST(t.ChildID as varchar(MAX)) + '/' as hierarchyid)--, 
    , 'asdf'  [name]       
    FROM @TT  t INNER JOIN s ON t.[ChildID]=s.[ParentID]
    where t.[ChildID]<>t.[ParentID]
)
SELECT [Level], [ParentID], [ChildID],   hid, 
lvl ,replicate('___', lvl)+[name] [name]
  FROM s  ORDER BY  hid 



и получаем всех родителей куда входит потомок ChildID=210049, но при этом сортировка "сбивается". Хотелось бы сохранить иерархию в "Красивом" виде, исключив все лишние. Может кто может помочь или ссылкой поделиться.
...
Рейтинг: 0 / 0
21.04.2020, 02:44
    #39949167
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос (сортировка)
Damir102,

Код: sql
1.
order by [ParentID], [hid]



?
...
Рейтинг: 0 / 0
21.04.2020, 03:51
    #39949172
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос (сортировка)
felix_ff, кажется [ParentID] нужно отдельно собирать в hierarchyid, по тому, что получится сортировать.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Иерархический запрос (сортировка) / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]