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

Тема в разделе "SQL", создана пользователем Balda, 22 сен 2008.

Статус темы:
Закрыта.
  1. Balda

    Balda Гость

    Есть таблица Subdiv, состоящая из столбцов ID,Name, ID_Parent
    (ID_Parent ссылается на ID родительской строки).
    По этой таблице програмно формируется дерево подразделений. Количество "веток" в каждом узле дерева разное.
    Пользователь выбирает один узел дерева, т.е. одну строку таблицы подразделений. Создается параметр @id, который равен ID выбранной строки.
    Необходимо вывести всех служащих, которые работают в выбранном подразделении.
    Вот как это было реализовано:
    1). Програмно подсчитываю максимальное количество веток в узле;
    2). В зависимости от этого количества формирую запрос. Например для узла с максимальным количеством веток = 3 запрос будет выглядеть следующим образом:
    Код (Text):
    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-х отображаються не все записи. Может быть логика запроса в чем-то не верна? :)
     
  2. Balda

    Balda Гость

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

    Aleksey Гость

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

    Первая же ссылка, которая мне попалось при поиске в гугле: http://www.sqlbooks.ru/readarticle.aspx?pa...;file=sql200509
     
  4. Balda

    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]
     
Загрузка...
Похожие Темы - Рекурсивная таблица
  1. Seriy1994
    Ответов:
    1
    Просмотров:
    1.146
  2. Seriy1994
    Ответов:
    1
    Просмотров:
    1.221
  3. Seriy1994
    Ответов:
    0
    Просмотров:
    1.037
  4. Seriy1994
    Ответов:
    0
    Просмотров:
    1.123
  5. Seriy1994
    Ответов:
    1
    Просмотров:
    1.018
Статус темы:
Закрыта.

Поделиться этой страницей