PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

requête récursive postgres sur la même table

Je suppose que vous voulez déplacer votre where document_id=1 dans la partie inférieure de la requête.

Méfiez-vous cependant, car une requête récursive n'injecte pas la contrainte dans le with déclaration. En d'autres termes, il analysera en fait l'intégralité de votre table, créera de manière récursive toutes les possibilités et filtrera celles dont vous avez besoin.

Vous serez mieux avec une fonction sql dans la pratique, c'est-à-dire quelque chose comme ceci :

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;