PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

query ricorsiva postgres sulla stessa tabella

Immagino che tu voglia spostare il tuo where document_id=1 nella parte inferiore della query.

Fai attenzione a farlo, tuttavia, perché una query ricorsiva non inserisce il vincolo nel with dichiarazione. In altre parole, eseguirà effettivamente la scansione di seq dell'intera tabella, costruirà ricorsivamente ogni possibilità e filtrerà quelle di cui hai bisogno.

In pratica starai meglio con una funzione sql, ad es. qualcosa del genere:

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;