Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рекурсивный запрос при помощи WITH REC  [new]
ariecberkut
Member

Откуда: Славянск
Сообщений: 8
// Исходные данные - код головного родителя (целое число)

DECLARE @main_id INT SET @main_id = <код головного родителя>

// Есть временнаая таблица для результата @tab и постоянная таблица PC для извлечения данных
// art_id - код потомка
// parent_id - код родителя
// count_pc - количество потомка в составе родителя
// gencount - количество потомка в составе головного родителя
DECLARE @tab table (art_id INT ,parent_id INT ,count_pc FLOAT,gencount FLOAT)
WITH REC (art_id,parent_id,count_pc,gencount)
AS
(
SELECT art_id,parent_id ,count_pc, count_pc as gencount FROM pc WHERE parent_id = @main_id
UNION ALL
SELECT art_id,parent_id,count_pc,(Rec.count_pc * pc.count_pc) as gencount FROM rec INNER JOIN pc ON REC.art_id = pc.parent_id
)
INSERT INTO @tab (art_id,parent_id,count_pc,gen_count) SELECT art_id,parent_id,count_pc,gen_count FROM REC

Методика отлично работает и позволяет рекурсивно извлечь данные о составе элементов в иерархичном формате, получив как количество элемента - потомка в составе элемента родителя , так и общее количество в составе головного узла.

Есть пожелание путём доработки кода получить в рамках этой методики строку полного пути входимости элемента в головной узел в виде строки с разделителем.
Например :
232232|4271|6988|12344
232232|4271|6988|12345
232233|4271|6988|12344
232234|4271|6988|12345

Попытка решить вопрос тем же методом что и вычисление общего количества, только путём строчкого суммирования id элементов,преобразованный в строку успехом не увенчалась. SQL не позволяет такого в рамках данной методики.
Прошу знатоков помочь в решении данного вопроса
1 окт 17, 12:34    [20834330]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос при помощи WITH REC  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
ariecberkut
Есть пожелание путём доработки кода получить в рамках этой методики строку полного пути входимости элемента в головной узел в виде строки с разделителем.
Во-первых, то, что вы показали, работать не будет, ибо перед WITH требуется точка с запятой.
Во-вторых, вы мне сломали глаза. Почему бы не оформить как положено тегом SRC?
В-третьих, что мешает добавить в REC ещё одно строковое поле FullPath, например, добавляя в конец
текущий ID (или что там нужно) с разделителем на каждом шаге рекурсии?
1 окт 17, 13:04    [20834370]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос при помощи WITH REC  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
ariecberkut,
зачем создавать новую тему, почему не продолжить коллективно создавать запрос в старой?
1 окт 17, 13:13    [20834381]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос при помощи WITH REC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Модератор: Действительно, не надо плодить темы.
1 окт 17, 13:16    [20834387]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить