PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

rekursive Postgres-Abfrage für dieselbe Tabelle

Ich nehme an, Sie möchten Ihr where document_id=1 in den unteren Teil der Abfrage verschieben.

Seien Sie dabei jedoch vorsichtig, da eine rekursive Abfrage die Einschränkung nicht in with einfügt Aussage. Mit anderen Worten, es scannt tatsächlich Ihre gesamte Tabelle, baut rekursiv alle Möglichkeiten auf und filtert diejenigen heraus, die Sie benötigen.

In der Praxis sind Sie mit einer SQL-Funktion besser bedient, also etwa so:

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;