powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как избавиться от рекурсии
12 сообщений из 12, страница 1 из 1
как избавиться от рекурсии
    #39324436
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как избавиться от рекурсии в запросе, использующем with recursive?
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39324535
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fobster,
я при вставке данных проверяю, чтоб они не создавали вечного цикла.
Но это на маленьких таблицах.
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39324602
g2099599
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fobster,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
drop table if exists tmp_items;
create TEMP table tmp_items as 
select * from (
	valueS('A1', null), ('B1', null), ('A2', 'A1'), ('B2', 'B1'), ('C2', 'B1'), ('D2', 'B1'), ('B1', 'D2')
) f (id, parent);


with recursive foo as (
	select id, parent, ARRAY[parent] || i.id  as path 
	from tmp_items i 
	where parent is null
	union all
	select  i.id, i.parent, f.path || i.id
	from foo f
	join tmp_items i on i.parent = f.id
	where NOT(path && array[i.id]) 
)
select * from foo



Другой вопрос как оно будет работать с большим уровнем вложенности (как будет оптимальнее через строки или массивы).
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39324805
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
g2099599,

как будет выглядеть рекурсивный запрос если не использовать with recursive?
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327023
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите переписать запрос циклами чтобы возвращались все предки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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



читаю здесь http://www.sql.ru/forum/325043/prodolzhaem-muchat-shop-zapros#3015052 пока ничего не получается..
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327047
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fobster,

емае, все дети, а не предки
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327245
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь есть кто-нибудь живой?
почему код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with tree(id, parent_id, name) as
(
SELECT id, parent_id, name
 FROM accounts.groups
 WHERE id='7e8a97b0-7353-11e6-84f9-2314e71f8a19'
 union all
  select  a.id,a.parent_id, a.name
 from accounts.groups a
 inner join tree t on a.parent_id = t.id
 )
 select * from tree


выводит ошибку:
ОШИБКА: отношение "tree" не существует
LINE 9: inner join tree t on a.parent_id = t.id
^
DETAIL: В WITH есть элемент "tree", но на него нельзя ссылаться из этой части запроса.
HINT: Используйте WITH RECURSIVE или исключите ссылки вперёд, переупорядочив элементы WITH.
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327269
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fobsterздесь есть кто-нибудь живой?В основном тут люди сдержанные. Не хотят грубить.
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327308
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fobsterздесь есть кто-нибудь живой?
почему код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with tree(id, parent_id, name) as
(
SELECT id, parent_id, name
 FROM accounts.groups
 WHERE id='7e8a97b0-7353-11e6-84f9-2314e71f8a19'
 union all
  select  a.id,a.parent_id, a.name
 from accounts.groups a
 inner join tree t on a.parent_id = t.id
 )
 select * from tree


выводит ошибку:
ОШИБКА: отношение "tree" не существует
LINE 9: inner join tree t on a.parent_id = t.id
^
DETAIL: В WITH есть элемент "tree", но на него нельзя ссылаться из этой части запроса.
HINT: Используйте WITH RECURSIVE или исключите ссылки вперёд, переупорядочив элементы WITH.
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327322
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq, мне нужен запрос без with recursive!
у меня есть
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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



я хочу запросить те же самые данные, но не используя with recursive! как еще описать что мне нужно, я больше не знаю.
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327425
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fobster,

какой язык у вас родной ?
в чем трудность обличения желаемого в слова ?

видимо хотите не вы и формулируете не вы , а кто--то хитроватый, вместо простого "без рекурсивного запроса" формулирует "без WITH recursive" ?

так вот, конструкция with recursive является неотъемлемой частью итеративного запроса, частью которого является и "рекурсивный член" в "рекурсивном" union [all] , упоминающем первый член (точнее -- предыдущую итерацию) этого юниона под псевдонимом, стоящим в наружнем алиасе ко всей конструкции. т.е. оставляя остальную конструкцию без изменений вы нарушаете синтаксис "рекурсивного запроса". а в не рекурсивном -- вы не можете упоминать "себя" внутри WITH.

Если вам надо (задание такое) написать функцию, не использующую "рекурсивного запроса" -- то см. по вашей же ссылке выше 3015052 -- но так ищутся именно предки, т.к. дети , в отличии от предков, могут ветвиться -- простой цикл должен тогда выдавать не одно следующее значение на шаге, а все. (что возможно, если вы будете возвращать массивы, и ,соответственно, вложите ещё один луп по членам этого массива )
, или пишите настоящую рекурсивную ф--ю, вызывающую саму себя (тут где--то были в количествах, лень искать или писать [искать "дерево"]), и возвращающую setof id следующего поколения (с вложенным возвратом рекурсивного вызова).
...
Рейтинг: 0 / 0
как избавиться от рекурсии
    #39327431
fobster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Спасибо тебе, добрый человек :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как избавиться от рекурсии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]