1

私は今それにほぼ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

ドキュメント 1 のすべてのリンクなどをカバーしたので、ドキュメント 2 で同じ演習を行います。

ここに私の再帰クエリがあります

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 に答える