powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Иерархический запрос (сортировка)
3 сообщений из 3, страница 1 из 1
Иерархический запрос (сортировка)
    #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
Иерархический запрос (сортировка)
    #39949167
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir102,

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



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


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