SQL查询在树中查找叶子

时间:2012-08-27 19:33:16

标签: sql activerecord tree

我在Postgres中存储了一个通过parent_id列链接的树。我想找到树的叶子,就像那些没有孩子的元素一样。这是我到目前为止的查询:

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)

1 个答案:

答案 0 :(得分:0)

该技术称为“排除连接”。

select e.* from elements e
left outer join elements leafs
on e.id = leafs.parent_id
where leafs.parent_id is null