Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на сущетсвование в дереве элемента 
V
    Опции темы
chip_and_dayl
Дата 21.4.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: нет
Всего: 9



Всем привет.
Есть отчеты, которые имеют дерево-подобную структуру. В базе хранятся так:

Таблица Группы_Отчетов
ИД         ИМЯ        ИД_РОДИТЕЛЯ
1          Группа1      null
2          Группа2      null
3          Группа3        1
4          Группа4        3

Таблица Отчеты
ИД        ИМЯ            ИД_ГРУППЫ
1         Отчет1           2
2         Отчет2           2
3         Отчет3           4

Задача которая сейчас передо мной стоит, это не строить те ветки, которые не содержат элементы (отчеты).
Вопрос: В каком направление копать, чтобы сделать проверку для ветки на наличие там отчета?


З. Ы. T-SQL (2000)

Это сообщение отредактировал(а) chip_and_dayl - 21.4.2011, 12:20


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Zloxa
Дата 21.4.2011, 13:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(chip_and_dayl @  21.4.2011,  12:20 Найти цитируемый пост)
не строить те ветки, которые не содержат элементы (отчеты).

понял задачу как: отфильтровать группы и подгруппы, которые не ассоциированы с отчетами, и не имеют в подчинении подгрупп, ассоцииированных с отчетом.
Цитата(chip_and_dayl @  21.4.2011,  12:20 Найти цитируемый пост)
T-SQL (2000)

Код

-- иммитация тестовых данных
create table #hier (id int primary key
                     ,name varchar(10)
                     ,parent_id int
                    );
insert into #hier 
  select 1, 'Группа1',null 
  union all select 2, 'Группа2',null
  union all select 3, 'Группа3',1
  union all select 4, 'Группа4',3
  union all select 5, 'Группа5',3
;
create table #reps(id int, group_id int);
insert into #reps
  select 1,4;

-- начало скрипта
-- временная табилца дря промежуточного расчета результата
create table #hier_ext (id int
                        ,parent_id int
                        ,level int -- счетчик вложенности иерархии
                        ,child_count int -- количество отчетов группы с учетом дочерних подгрупп
                        ) 
-- заполняем промежуточную таблицу корневыми элементами дерева
insert into #hier_ext  
  select t.id,t.parent_id,1,null
    from #hier t where t.parent_id is null;
-- обходим дерево наращивая счетчик вложенности иерархии
declare he cursor 
  for select id,level from #hier_ext;
declare @he_id int, @level int;
open he;
fetch next from he into @he_id,@level;
while @@fetch_status = 0
begin 
  insert into #hier_ext 
     select t.id,t.parent_id,@level+1,null
      from #hier t 
      where t.parent_id = @he_id;
  fetch next from he into @he_id,@level;
end
close he;
deallocate he;
-- начиная с самой глубокой ветки иерархии расчитыаетм количество отчетов, с учетом ранее расчитанных дочерних подгрупп
declare c cursor for select id from #hier_ext order by level desc;
open c
fetch next from c into @he_id;
while @@fetch_status = 0
begin 
  update t
    set child_count = (select count(*) from #reps r where r.group_id = t.id )
                       +(select isnull(sum(s.child_count),0) from #hier_ext s where s.parent_id = t.id)
    from #hier_ext t
    where t.id = @he_id;
  fetch next from  c into @he_id;
end
close c;
deallocate c;
-- выводим результат
select h.* 
from #hier_ext he 
inner join #hier h on h.id = he.id
where he.child_count > 0;
-- подтираемся
drop table #hier;
drop table #reps;
drop table #hier_ext;

Код

id          name       parent_id
----------- ---------- -----------
1           Группа1    NULL
3           Группа3    1
4           Группа4    3

(3 row(s) affected)






--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
chip_and_dayl
Дата 21.4.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: нет
Всего: 9



Цитата(Zloxa @  21.4.2011,  13:24 Найти цитируемый пост)
понял задачу как: отфильтровать группы и подгруппы, которые не ассоциированы с отчетами, и не имеют в подчинении подгрупп, ассоцииированных с отчетом.

Совершенно верно. Большое спасибо


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.