我想要做的是构建一个图表,通过他的网址显示从文档生成的所有孩子。 例 从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;
答案 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;