рекурсивный запрос postgres для той же таблицы - PullRequest
1 голос
/ 12 мая 2011

Я потратил почти целый день на это сейчас, и кажется, что я делаю что-то не так. хорошо, вот соотношение: document_urls (doc_id, url_id)

что я хочу сделать, это построить граф, который будет показывать всех детей, которые были сгенерированы из документа по его URL-адресам. пример выберите * из document_urls, где doc_id = 1

doc_id url_id
1 2
1 3

если я выберу весь документ с url_id = 3 или 2, я найду выберите * из document_urls, где url_id = 2 или url_id = 3

doc_id url_id
1 2
1 3
2 3

Теперь я делаю то же упражнение с документом 2, так как мы рассмотрели все ссылки на документ 1 и т. Д.

вот мой рекурсивный запрос сейчас

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 limit 10;

1 Ответ

2 голосов
/ 12 мая 2011

Насколько я понимаю, вы хотите переместить ваш where_did_id = 1 в нижнюю часть запроса.

Однако будьте осторожны, поскольку рекурсивный запрос не вводит ограничение в with заявление.Другими словами, он на самом деле будет сканировать всю таблицу целиком, рекурсивно строить каждую возможность и отфильтровывать те, которые вам нужны.

На практике вам лучше будет использовать функцию sql, то есть что-то вроде этого:

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;
...