postgres在同一个表上的递归查询

时间:2011-05-12 15:39:38

标签: sql postgresql recursion recursive-query

我现在花了差不多一天的时间,似乎我做错了什么。 好的,这是关系: document_urls(doc_id,url_id)

我想要做的是构建一个图表,通过他的网址显示从文档生成的所有孩子。 例 从document_urls中选择*,其中doc_id = 1

doc_id url_id
1 2
1 3

如果我选择url_id = 3或2的所有文件,我会找到 select * from 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 个答案:

答案 0 :(得分:2)

我认为你想将你的document_id = 1移动到查询的下半部分。

但是,请注意这样做,因为递归查询不会将约束注入with语句。换句话说,它实际上会seq扫描整个表格,递归地建立所有可能性并过滤掉你需要的那些。

在实践中你最好使用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;