powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задача с деревьями
10 сообщений из 10, страница 1 из 1
Задача с деревьями
    #32005237
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая таблица с данными
create table #tree(id int identity, parent int , n varchar(33), le int, ri int)

go
set nocount on
insert #tree select 0, 'K',1,16
insert #tree select 1, '1',2,13
insert #tree select 2, '11',3,4
insert #tree select 2, '12',5,12
insert #tree select 4, '121',6,7
insert #tree select 4, '122',8,9
insert #tree select 4, '123',10,11
insert #tree select 2, '2',14,15

Такой запрос
select replicate('-',count(*))+t1.n
from #tree t1, #tree t2
where t2.le<t1.le and t2.ri>t1.ri
group by t1.n, t1.le
order by t1.le

выдаст мне(и вам):

-1
--11
--12
---121
---122
---123
-2
(минусик использую из-за того что пробел тут не виден будет)

мне же надо получить дерево в виде:

-1 1
--11 1
--11 2
--12 1
---121 1
---121 2
---122 1
---122 2
---123 1
---123 2
--12 2
-1 2
-2 1
-2 2

Т.е. что бы каждый элемент появился бы два раза: в начале ветви(1) и по её завершении(2).
Второй день не могу сообразить, хотя есть такое чуйство что это можно.

Заранее благодарен
С приветом Сергей
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005239
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так не устроит?


select replicate('-',count(*))+t1.n, substring(t1.n, case len(t1.n) when 1 then 1 else len(t1.n) end, 1)
from #tree t1, #tree t2
where t2.le<t1.le and t2.ri>t1.ri
group by t1.n, t1.le
order by t1.le


Сорри не до конца понял задачу
этот не подойдет
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005250
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы, отвечаю сам себе(как тут не поверить в собственную гениальность )

Решение оказалось на редкость простое и красивое

select replicate('-',count(*))+t1.n+ ' '+convert(varchar,i)
from #tree t1, #tree t2 ,(select 1 i union select 2) as n
where t2.le<t1.le and t2.ri>t1.ri
group by t1.n,t1.ri, t1.le,i
order by t1.le*(2-i)+t1.ri*(i-1)
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005251
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что можно сказать? Да ничего!! БЛЕСК!!

Спасибо, кстати, что Вы ответили, я уже всю голову поломал пытаясь решить эту задачку
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005275
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто из любопытства... А для чего понадобилось решать такую задачу? Я тоже ковыряюсь с деревьями и вообще графами, но эта задача меня озадачила. Может, я ее просто не понял...
Вообще, в классике по B-деревьям наиболее часто возникают задачи:
1. Определить, находится ли узел А в поддереве, вершиной которой является узел Б.
2. Выборка всех родителей узла А в порядке их уровня в дереве.
3. Выборка всех узлов, находящихся в поддереве, вершиной которой является узел А.
4. Выборка всех узлов, прямым родителем которых является узел А.
Для B-деревьев специфической структуры:
5. Определение наиболее близкого общего родителя для узлов А и Б.
6. Задача балансировки дерева с целью уменьшения его максимальной глубины (обычно используется по специфическим структурам для ускорения поиска по B-дереву).
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005294
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya

Есть некий отчет примерно такой формы:
отчет Х
__Раздел 1
____подраздел 1.1
______подподраздел 1.1.1
______подподраздел 1.1.2
____итого по подразделу 1.1
__Итого по разделу 1
итого по отчету Х

Т.е. сначала идет заголовок некого раздела, внутри его подразделы, а потом общая сумма по разделу. Или в этих случаях надо как-то по другому делать?
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005368
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже полагал, что сам допер... Тут знакомый подсказал, что ты, наверное, пытаешься слепить динамический HTML. И поскольку в нем теги обозначаются метками начала и конца тега, приходится повторять одну метку в начале и в конце. Оказалось, догадка была ошибочной...
А по отчетам, IMHO, можно и без подобных выкрутасов обойтись. Правда, специфика зависит от конкретного генератора отчетов. Я использовал Crisatl Reports и конструктор отчетов MS Access (кстати, насколько мне известно, механизм отчетов для MS Access был разработан как раз Cristal). И в первом, и во втором случае не требуется дублирование записей в источнике.
При формировании заголовка раздела не происходит перемещения на следующую запись в наборе данных. Поэтому одна и та же запись используется как в разделе заголовка, так и в области данных. Пока выводятся строки в области данных, подсчитываются промежуточные итоги для соответствующих разделов. Но все это внутренняя кухня, над которой даже не приходится задумываться. Если ты поля итогов разместишь не ПОД а НАД разделом данных, то отчет автоматически станет двухпроходным. Но работать будет и будет выдавать правильные результаты (только потормознеет).
Сообщи, какой используешь генератор отчетов.
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005391
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отчет в виде динамического HTML

Если использовать стандартные отчеты с группировками - то это и так понятно. Правда не знаю можно ли это будет делать если неизвестен уровень вложенности.
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005402
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Access выкрутиться можно. Для этого компоновка отчета тоже делается динамической. Сначала конструируется отчет, потом открывается. Но возни для такого варианта раз в несколько больше, чем для статического отчета.
...
Рейтинг: 0 / 0
Задача с деревьями
    #32005543
Мне кажется что для подитогов очень удобно использовать ROLLUP.
Тогда строчка с итогами появится автоматически.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задача с деревьями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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