Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия в ХП 
:(
    Опции темы
Ronin08
Дата 1.4.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Доброго времени суток

Имеются таблицы 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
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
emmanuil
Дата 2.4.2009, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



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

PM MAIL   Вверх
1stain
Дата 2.4.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



Код

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 ;



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
emmanuil
Дата 2.4.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



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

PM MAIL   Вверх
Ronin08
Дата 4.4.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Вобщем я сделал так 
Код

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


Это сообщение отредактировал(а) Ronin08 - 4.4.2009, 22:44
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.