powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дерево из таблицы по id/pid
4 сообщений из 4, страница 1 из 1
Дерево из таблицы по id/pid
    #32144568
LANKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
id	pid	name
 ---------------------------------
 
 1 	 0 	Graphics
 2 	 1 	Vector
 3 	 2 	CorelDraw
 4 	 2 	Xara
 5 	 1 	Raster
 6 	 5 	PhotoShop
 7 	 6 	PaintShopPro
 8 	 0 	Programming
 9 	 8 	Borland Delphi Studio
 10 	 8 	Borland C++ Studio


id - счётчик, pid - указание на материнский id, name - название.

Задача:
Создать ListBox, где строки былы бы в виде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Graphics
 - Vector
    - CorelDraw
    - Xara
 - Raster
    - PhotoShop
    - PaintShopPro
Programming
 - Borland Delphi Studio
 - Borland C++ Studio

Условие: количество разделов/подразделов неограничено.

Может у кого есть готовый алгоритм вывода такого дерева.
Спасибо.
...
Рейтинг: 0 / 0
Дерево из таблицы по id/pid
    #32144573
Евгения
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример (спасибо SergSuper) на T-SQL

Цитата из ранних топиков:

set nocount on

declare @idParent int set @idParent=0

declare @t table(id int, parent int null, name varchar(10))
insert @t select 0, NULL, 0
insert @t select 1, 0, 1
insert @t select 2, 0, 2
insert @t select 3, 0, 3
insert @t select 4, 0, 4
insert @t select 5, 0, 5
insert @t select 6, 1, 6
insert @t select 7, 1, 7
insert @t select 8, 7, 8
insert @t select 9, 7, 9


declare @r table( id int,parent int null, level int, ord int null)
declare @level int

set @level=0
insert @r select @idParent, null, @level, 0
while exists(select * from @t t, @r r where level=@level and t.id=r.id)
begin
insert @r select t.id, t.parent, @level+1, null
from @t t, @r r
where level=@level and t.parent=r.id
set @level=@level+1

update r
set ord=ord+(select count(*) from @r r1, @r r2 -- здесь была ошибка
where r2.ord is null and r2.parent = r1.id and r1.ord<r.ord)
from @r r

update r1 set ord= r2.ord+(select count(*) from @r r3 where r3.parent=r1.parent and r3.id<=r1.id)
from @r r1, @r r2
where r1.ord is null and r1.parent=r2.id

end

select * from @r
select space(level * 2)+name from @r r , @t t where r.id=t.id order by ord


Если Вы хотите спросить по какому принципу будет отсортированы ветви одного уровня - то это задаётся в предпоследнем update:
update r1 set ord= r2.ord+(select count(*) from @r r3 where r3.parent=r1.parent and r3.id<=r1.id)
если Вы будете сравнивать здесь имена - будет отсортировано по именам(но надо только что бы они были все разные)
...
Рейтинг: 0 / 0
Дерево из таблицы по id/pid
    #32145797
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если дерево не надо очень часто обновлять то идеально следующее:
http://sdm.viptop.ru/articles/sqltrees.html
...
Рейтинг: 0 / 0
Дерево из таблицы по id/pid
    #32146241
LANKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>4d_monster
спасибо. статью уже читал.
:))
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дерево из таблицы по id/pid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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