powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обход дерева
3 сообщений из 3, страница 1 из 1
Обход дерева
    #32075013
vislex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста со следующей задачей:

Имеется таблица:
ID_MATERIAL | PARENT_ID | Name

Здесь хранятся категории и подкатегории.
Пример:

>Ткани
>Категория 1
>Отечественные
>Дорогие
>Дешевые
>Импортные
>Категория 2
>Категория 3
и т.д.

Необходимо с помощью SQL скриптов, написать обход дерева, где входным параметром в скрипт, должна являться какя - либо ветка дерева.
К примеру, при выборе ветки Категория 1, должны выводится только подветки этой категории.
Может кто писал, подобное :)
СПАСИБО.

С Уважением, Алексей
...
Рейтинг: 0 / 0
Обход дерева
    #32075053
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!
...
Рейтинг: 0 / 0
Обход дерева
    #32075284
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на тему деревъев тут можно найти вагон и маленькую тележку.

В твоем случае, без переделки структуры таблиц и если количество уровней заранее неизвестно, то вот вариант с временной таблицей:


Код: plaintext
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.
Declare @I_D Int  --входной номер ветки
 
SET NOCOUNT ON
Declare @Level Int
Declare @LastCount Int

Create Table #Tmp (I_D Int, Level Int)
 --если количество нодов в ветках может быть большим, то я обычно добавляю еще и индекс:
 
CREATE  INDEX [IX_TMP] ON #Tmp ([I_D], [Level]) 

Set @Level =  1 
Insert Into #Tmp (I_D, Level) Values (@I_D, @Level)
Set @LastCount = @@ROWCOUNT
While @LastCount >  0  
Begin
  Set @Level = @Level +  1 
  Insert Into #Tmp (I_D, Level) 
  Select ID_MATERIAL,  @Level 
  From tbl_Tree Inner Join #Tmp On #Tmp.I_D = tbl_Tree.PARENT_ID 
  Where #Tmp.Level = @Level  
  Set @LastCount = @@ROWCOUNT
End
SET NOCOUNT OFF
Select tbl_Tree.* 
From tbl_Tree Inner Join #Tmp On #Tmp.I_D = tbl_Tree.PARENT_ID 
Order By #Tmp.Level, tbl_Tree.Name

тоже самое можно сделать и на курсоре - оставлю в качестве упражнения для желающих.
Рекурсию в случае неизвестного наперед (или не ограниченного условиями задачи) количества уровней применять не рекомендую.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обход дерева
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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