Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как запросом вернуть все записи ветки до определенного уровня? / 4 сообщений из 4, страница 1 из 1
10.01.2002, 12:42
    #32020461
Aleksandr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом вернуть все записи ветки до определенного уровня?
Уважаемые коллеги!
Суть проблемы такова:
Есть таблица пользователей и таблица доступов. Каждый пользователь подчинен руководителю в древовидной структуре.
Запрос должен вернуть всех пользователей, являющихся подчиненными данного, а также всех, являющихся подчиненными начальника (включая их подчиненных), до того уровня, в котором начальник уже имеет доступ, например

Начальник1
Подначальник1 Подначальник2
Подчиненный1 Подчиненный2 Подчиненный3 Подчиненный4

Если идет проверка Подчиненный1, то запрос должен вернуть также Подчиненный2 и Подначальник1, а если идет проверка Подначальник1, то Подчиненный1,Подчиненный2,Подначальник2,Подчиненный3 и Подчиненный4. Не могу сообразить, как это оформить...
...
Рейтинг: 0 / 0
10.01.2002, 14:46
    #32020472
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом вернуть все записи ветки до определенного уровня?
http://sdm.viptop.ru/articles/sqltrees.html
...
Рейтинг: 0 / 0
11.01.2002, 03:33
    #32020501
Sergey Vinogradov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом вернуть все записи ветки до определенного уровня?
Есть еще вариант:
http://rdbms.narod.ru/article/tree/index.html
...
Рейтинг: 0 / 0
11.01.2002, 06:00
    #32020508
SergD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запросом вернуть все записи ветки до определенного уровня?
Я постоянно пользуюсь для реализации подобных деревьев рекурсией не очень быстро - зато просто:
Допустим есть таблица
List(ID,UpID) и хочется получить всех потомков вершины @LevelID

CREATE PROCEDURE TreeExample
@Level VARCHAR(50)
AS
SET NOCOUNT ON
DECLARE @tmpLevel VARCHAR(50)
SELECT @tmpLevel=(SELECT MIN(ID) FROM List WHERE UpID=@Level)
IF @tmpLevel IS NOT NULL
SELECT @tmpLevel
WHILE @tmpLevel IS NOT NULL
BEGIN
EXEC TreeExample @TLevel
SELECT @tmpLevel=(SELECT MIN(ID) FROM List WHERE UpID=@Level AND ID>@tmpLevel)
IF @tmpLevel IS NOT NULL
SELECT @tmpLevel
END

Обычно результат процедуры помещаю во временную таблицу и далее вывожу как мне нужно
Сергей.
p.s. Этот вариант стал рабочим в версиях SQL с 7.0 где микросовт подкрутил максимальное количество вложенных вызовов процедур , в 6.5 было очень мало, сколько не помню толи 16 толи и того меньше.

С уважением, Сергей.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как запросом вернуть все записи ветки до определенного уровня? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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