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 回答