Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Рекурсия в ХП


Автор: Ronin08 1.4.2009, 11:23
Доброго времени суток

Имеются таблицы Item(ItemId(PK), Item, ParentId,...) и IncExp (CountId, ItemId(FK),...), 
Я разобрался как используя рекурсию извлечь всех потомков Item.ItemId:

Код

 BEGIN
    WITH 
   tree (id, items,idParent) 
   AS (SELECT ItemId, Item, ParentId
      FROM Item 
      WHERE ItemId = @ItemId 
      UNION ALL 
      SELECT ItemId, Item, ParentId 
      FROM Item  
          INNER JOIN tree t 
           ON t.id = Item.ParentId)
    SELECT * FROM tree 
END


Как сделать Хранимую процедуру, которая бы для конкретного IncExp.CountId и Item.ItemId (включая всех детей )выводила всю информацию из IncExp

Автор: emmanuil 2.4.2009, 07:27
Цитата(Ronin08 @  1.4.2009,  09:23 Найти цитируемый пост)
(включая всех детей )
 Что имеется в виду? Все поля или все дочерние строки?

Автор: 1stain 2.4.2009, 09:53
Код

WITH    tree ( CountID, /* поля из IncExp, которые надо выбирать */ ItemID, ParentID )
          AS ( SELECT
                [IncExp].[CountID],
                -- поля из IncExp, которые надо выбирать
                [IncExp].[ItemID],
                [Item].[ParentID]
               FROM
                [IncExp]
               INNER JOIN [Item]
                ON [IncExp].[ItemID] = [Item].[ItemID]
               WHERE
                [IncExp].[ItemID] = @ItemId
                AND [IncExp].[CountID] = @CountID
               UNION ALL
               SELECT
                [IncExp].[CountID],
                -- поля из IncExp, которые надо выбирать
                [IncExp].[ItemID],
                [Item].[ParentID]
               FROM
                [IncExp]
               INNER JOIN [Item]
                ON [IncExp].[ItemID] = [Item].[ItemID]
               INNER JOIN tree t
                ON t.[ItemID] = Item.[ParentID]
               WHERE
                [IncExp].[CountID] = @CountID
             )
    SELECT
        *
    FROM
        tree ;

Автор: emmanuil 2.4.2009, 11:35
Цитата(emmanuil @  2.4.2009,  05:27 Найти цитируемый пост)
Цитата(Ronin08 @  1.4.2009,  09:23 )(включая всех детей ) Что имеется в виду? Все поля или все дочерние строки?
 Тьфу ты, не так прочитал.

Автор: Ronin08 4.4.2009, 22:43
Вобщем я сделал так 
Код

BEGIN
WITH 
   tree (id, items, idParent) 
   AS (SELECT Item.ItemId, Item.Item, Item.ParentId
      FROM Item 
      WHERE Item.ItemId = @ItemId and Item.UserId = @UserId and Item.IncFlag=@IncFlag
      UNION ALL 
      SELECT Item.ItemId, Item.Item, Item.ParentId 
      FROM Item  
      JOIN tree   ON tree.id = Item.ParentId)

select 
    IncExp.CountName,
    IncExp.Expanse,
    tree.items
from IncExp
inner join tree on tree.id = IncExp.ItemId 
end

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)