PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

consulta recursiva postgres na mesma tabela


Suponho que você queira mover seu where document_id=1 para a parte inferior da consulta.

Tenha cuidado ao fazer isso, no entanto, porque uma consulta recursiva não injeta a restrição no with declaração. Em outras palavras, na verdade ele fará uma varredura sequencial em toda a sua tabela, construirá recursivamente todas as possibilidades e filtrará aquelas que você precisa.

Você ficará melhor com uma função sql na prática, ou seja, algo assim:
create or replace function gen_links(int) returns table (doc_id int, doc_url text) as $$
WITH  RECURSIVE generate_links(document_id,url_id) as(  
    select document_id,url_id from document_urls where document_id=$1
UNION ALL
    select du.document_id,du.url_id from generate_links gl,document_urls du
    where gl.url_id=du.url_id 
)

SELECT * FROM generate_links GROUP BY url_id,document_id;
$$ language sql stable;