Поддерживает ли postgresql рекурсивные запросы, в которых используются предложения WITH? Если так, что-то подобное может сработать. (Если вы хотите получить проверенный ответ, предоставьте в своем вопросе несколько операторов CREATE TABLE и INSERT, а также результаты, необходимые для выборки данных в INSERT.)
with Links(id,link,data) as (
select
id, redirectid, data
from T
where redirectid is null
union all
select
id, redirectid, null
from T
where redirectid is not null
union all
select
Links.id,
T.redirectid,
case when T.redirectid is null then T.data else null end
from T
join Links
on Links.link = T.id
)
select id, data
from Links
where data is not null;
Дополнительные замечания:
:( Вы можете реализовать рекурсию самостоятельно на основе выражения WITH. Я не знаю синтаксиса postgresql для последовательного программирования, так что это немного псевдо:
Вставьте результат этого запроса в новую таблицу с именем Links:
select
id, redirectid as link, data, 0 as depth
from T
where redirectid is null
union all
select
id, redirectid, null, 0
from T
where redirectid is not null
Также объявите целое число :: глубины и инициализируйте его до нуля. Затем повторяйте следующее, пока строки больше не будут добавлены в ссылки. Ссылки будут содержать ваш результат.
increment ::depth;
insert into Links
select
Links.id,
T.redirectid,
case when T.redirectid is null then T.data else null end,
depth + 1
from T join Links
on Links.link = T.id
where depth = ::depth-1;
end;
Я думаю, что это будет лучше, чем любое решение для курсора. На самом деле, я не могу думать о том, как курсоры будут полезны для этой проблемы вообще.
Обратите внимание, что это не прекратится, если есть какие-либо циклы (перенаправления, которые в конечном итоге являются круговыми).