Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2024, 19:21   #1
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 19
По умолчанию обход дерева с помощью рекурсии

Здравствуйте, уважаемые профессионалы!
Возникла весьма банальная задача, которую я никак не могу решить уже 2 дня. Банально, есть две таблицы отдел и сотрудники. Отделы имеют подотделы, сотрудники могут работать в отделах.
(treetable.jpg)
Код:
REATE TABLE [dbo].[Dep](
	[id] [smallint] NOT NULL,
	[title] [nchar](30) NOT NULL,
	[headDep] [smallint] NULL,
CONSTRAINT [FK_Dep_Dep] FOREIGN KEY([headDep])
REFERENCES [dbo].[Dep] ([id])
GO

CREATE TABLE [dbo].[Empl](
	[empNum] [int] NOT NULL,
	[FIO] [nchar](80) NOT NULL,
	[dep] [smallint] NULL,
CONSTRAINT [FK_Empl_Dep] FOREIGN KEY([dep]) REFERENCES Dep(ID)
Нужно подсчитать количество сотрудников в каждом отделе с учетом подотделов.


Путем различных махинаций я создал вьюшку следующего вида (здесь указано, из каких отделов (contains) состоит каждый подотдел (id) с количеством сотрудников в подотделах):
(treetable1.jpg)
и дальше применил рекурсию вида:
Код:
with rec(id, pid, empCount) as
(select id, [contains], empCount from recwithcount1 where [contains] is null
union all
select l.id, l.[contains], l.empCount 
from recwithcount1 l, rec r
where l.[contains]=r.id
)
select * from rec
которая, казалось бы, дает возможность подсчитать количество сотрудников в подотделах. Но не тут-то было! Рекурсия обходит дерево вида
(tree.jpg)
но учитывает только смежные ребра (в скобках указано кол-во сотрудников в отделе)
(treetable.jpg)
Как бы заставить рекурсию суммировать веса каждой из вершин, чтобы решить таки задачу?
Изображения
Тип файла: png table dep.png (4.5 Кб, 11 просмотров)
Тип файла: jpg table dep1.jpg (24.5 Кб, 11 просмотров)
Тип файла: jpg tree.jpg (39.6 Кб, 11 просмотров)
Тип файла: jpg tree_table.jpg (19.3 Кб, 11 просмотров)
t232006 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows Forms - как переделать чтобы был обход в ширину бинарного дерева (в том что нашел обход в глубину) Audax_Rogerus Windows Forms 0 17.07.2020 08:36
Помогите с задачей по рекурсии: массив 1..N. с N переход на позицию N + 1 или N + 5. Определить с помощью рекурсии можно ли собрать сумму чисел K polsovatel C# (си шарп) 2 22.09.2016 02:52
Вывод структуры дерева без рекурсии Alexander X Общие вопросы C/C++ 1 25.11.2013 20:59
Обход дерева mohita C# (си шарп) 1 11.12.2011 19:48
обход дерева ribka Помощь студентам 2 11.12.2007 20:38