• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Рекурсивная таблица

  • Автор темы Balda
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Balda

Есть таблица Subdiv, состоящая из столбцов ID,Name, ID_Parent
(ID_Parent ссылается на ID родительской строки).
По этой таблице програмно формируется дерево подразделений. Количество "веток" в каждом узле дерева разное.
Пользователь выбирает один узел дерева, т.е. одну строку таблицы подразделений. Создается параметр @id, который равен ID выбранной строки.
Необходимо вывести всех служащих, которые работают в выбранном подразделении.
Вот как это было реализовано:
1). Програмно подсчитываю максимальное количество веток в узле;
2). В зависимости от этого количества формирую запрос. Например для узла с максимальным количеством веток = 3 запрос будет выглядеть следующим образом:
Код:
SELECT  
Employees.Surname,
Subdiv.Name

FROM
Employees
LEFT JOIN Subdiv on Employees.ID_emp=Subdiv.ID
INNER JOIN 
(select distinct * from Subdiv) sel1 ON sel1.ID= Subdiv.ID_Parent
INNER JOIN 
(select distinct * from Subdiv) sel2 ON sel2.ID= sel1.ID_Parent
INNER JOIN 
(select distinct * from Subdiv) sel3 ON sel3.ID= sel2.ID_Parent

WHERE
(Subdiv.ID=@id OR sel1.ID=@id OR sel2.ID=@id OR sel3.ID=@id)
Все остальные запросы создаються аналогично.

Теперь в чем проблема:
при максимальном количестве веток больше 2-х отображаються не все записи. Может быть логика запроса в чем-то не верна? :)
 
B

Balda

MS SQL Server 2005.
А прога написана в MS Visual Studio .NET 2003 на C#.
 
A

Aleksey

Насколько мне известно MS SQL 2005 поддерживает рекурсивные запросы, с помощью которых вы забудете о той, простите, ерунде, которую изобразили :)

Первая же ссылка, которая мне попалось при поиске в гугле:
 
B

Balda

Вот. Получилось ))
Если кому ещё пригодится то вот результат моих усилий:
[codebox]
WITH
tree(name,id)
AS
(
SELECT Subdiv.Name, Subdiv.ID
FROM Subdiv
WHERE Subdiv.ID=@id
UNION ALL
SELECT Sub.Name, Sub.ID
FROM Subdiv Sub
INNER JOIN tree ON tree.id = Sub.ID_Parent
)

SELECT
Employees.Surname, Subdiv.Name
FROM
Employees
LEFT JOIN Subdiv on Employees.ID_emp=Subdiv.ID
INNER JOIN tree ON tree.id = Subdiv.ID
[/codebox]
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!