0

parent_id 列を介してリンクされた Postgres にツリーを保存しています。子を持たない要素のように、ツリーの葉を見つけたいと思います。これまでのクエリは次のとおりです。

where("id NOT IN ( SELECT parent_id FROM elements WHERE parent_id IS NOT NULL )")

このクエリを記述するより良い方法はありますか? ジョインで処理する方が効率的だと聞いたので、どうにかできないかと考えていたのですが、思いつきませんでした。また、生のSQLなしでこれを行い、代わりにActiveRecordを使用する方法はありますか?

更新: スキーマは次のとおりです。

   Column   |            Type             |     Modifiers      
------------+-----------------------------+--------------------
 id         | character varying(36)       | not null
 user_id    | character varying(36)       | not null
 parent_id  | character varying(36)       | 
 title      | character varying(255)      | 
 created_at | timestamp without time zone | not null
 updated_at | timestamp without time zone | not null
Indexes:
    "index_elements_on_id" UNIQUE, btree (id)
    "index_elements_on_parent_id" btree (parent_id)
    "index_elements_on_user_id" btree (user_id)
4

1 に答える 1

0

この手法は「排他結合」と呼ばれます。

select e.* from elements e
left outer join elements leafs
on e.id = leafs.parent_id
where leafs.parent_id is null
于 2012-08-27T20:04:47.027 に答える