Ответ 1
Все можно решить, используя несколько функций, и это просто с некоторой рекурсией (обратите внимание, что максимальный уровень рекурсии в T-SQL равен 32)
Предполагая, что у нас есть следующая таблица: (для очень маленькой компании)
TableName: Employees
id.....name..............manager_id
1 Big Boss NULL
2 Sales Manager 1
3 Support Manager 1
4 R&D Manager 1
5 Sales man 2
6 Support man 3
7 R&D Team leader 4
8 QA Team leader 4
9 C Developer 7
10 QA man 8
11 Java Developer 7
Нам просто нужна функция, чтобы проверить, есть ли связь между двумя идентификаторами, и другая функция, чтобы указать путь от одного к другому.
Первая функция очень проста с использованием рекурсии:
Create Function dbo.Do_WE_Have_path(@id int, @boss_id int, @max_level int) returns int
Begin
declare @res int, @man int
set @res = 0
if @id = @boss_id
set @res = 1
else if @max_level > 0
Begin
Select @man=manager_id from Employees where [email protected]
set @res = Do_WE_Have_path(@man, @boss_id, @max_level-1) --recursion
End
return res
End
Используя вышеупомянутую функцию, мы можем выбрать все объекты с соединением, которое короче или равно указанному уровню, поэтому теперь мы можем написать метод, который строит путь, если он существует, обратите внимание, что несуществующий путь должен быть отфильтрован с использованием вышеуказанного метода.
Create Function dbo.Make_The_path(@id int, @boss_id int, @max_level int) returns varchar(max)
Begin
declare @res varchar(max), @man int
select @res = name from Employees where [email protected]
if max_level > 0 AND @id <> @boss_id
Begin
select @man = manager_id from Employees where id = @id
set @res = dbo.Make_The_path(@man, @boss_id, max_level-1) + '/' + @res
End
return @res
End
Теперь мы можем использовать обе функции, чтобы получить путь от начальника к рабочим:
Select dbo.Make_The_path(id, 1, 3) Where Do_WE_Have_path(id, 1, 3)=1
Обе функции могут быть объединены в одну, и, возможно, вам придется написать ее снова для каждой структуры, но важно то, что это возможно.