1

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

我想要做的是构建一个图表,它将显示通过他的 url 从文档生成的所有孩子。示例 select * from document_urls where doc_id=1

doc_id url_id
1 2
1 3

如果我选择所有带有 url_id=3 或 2 的文档,我会找到 select * from document_urls where url_id=2 or 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;
4

1 回答 1

2

我认为您想将 where 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;
于 2011-05-12T16:04:16.203 回答