Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2016, 16:40   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию как избавиться от рекурсии

как избавиться от with recursive в запросе (т.е. переписать запрос через цикл) POSTGRESQL
Код:
CREATE OR REPLACE FUNCTION accounts.get_group_by_group(_id uuid)
  RETURNS SETOF uuid AS
$BODY$
BEGIN
RETURN query
WITH RECURSIVE R AS 
(SELECT id
 FROM accounts.groups WHERE id=(_id)
UNION ALL
   SELECT accounts.groups.id
   FROM accounts.groups
      JOIN R
          ON accounts.groups.parent_id = r.id
)
SELECT *FROM R;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION accounts.get_group_by_group(uuid)
  OWNER TO postgres;
kate158 вне форума Ответить с цитированием
Старый 11.10.2016, 17:37   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А зачем из конфетки монстрика делать? C POSTGRESQL сильно на вы, ну а так цикл LOOP , курсор или пара. На MS SQL написал бы, а здесь пас
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.10.2016, 17:52   #3
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

напиши на ms sql, если не трудно
бьюсь весь день) не выходит ничего с loop
пока это все:
Код:
CREATE OR REPLACE FUNCTION accounts.without_recursive(_id uuid)  RETURNS table (id uuid, parent_id uuid, name character varying(64))AS
$BODY$
DECLARE
row_id uuid;
row_parent_id uuid;

BEGIN
-- выводим текущий id
return query
  select us.id, us.parent_id, us.name
  from accounts.groups us
  where us.id = _id;
-- выводим его детей
FOR row_id,row_parent_id in
  SELECT us.id, us.parent_id, us.name FROM accounts.groups us WHERE us.parent_id = _id
LOOP
  return query
    select r.id, r.parent_id, r.name
    from accounts.groups as r where r.parent_id=us.id;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' STABLE STRICT
но код неверно работает, выводит только вершину дерева
у меня кажется у самой скоро будет рекурсия

Последний раз редактировалось kate158; 11.10.2016 в 18:10.
kate158 вне форума Ответить с цитированием
Старый 11.10.2016, 19:00   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А здесь посмотри чем в MS SQL рекурсивный запрос от цикла отличается.
http://programmersforum.ru/showthread.php?t=268818
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Избавиться от рекурсии a.n.o.n.i.m C# (си шарп) 7 26.09.2016 23:30
Помогите с задачей по рекурсии: массив 1..N. с N переход на позицию N + 1 или N + 5. Определить с помощью рекурсии можно ли собрать сумму чисел K polsovatel C# (си шарп) 2 22.09.2016 02:52
Как избавиться от #Н/Д? kachorro Microsoft Office Excel 10 26.04.2012 06:38
как избавиться от 1.#INF ? Razza Общие вопросы C/C++ 2 19.12.2010 17:45
Как избавиться от атозамены Vatrolf Microsoft Office Excel 2 06.08.2010 14:45