我在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)
答案 0 :(得分:0)
该技术称为“排除连接”。
select e.* from elements e
left outer join elements leafs
on e.id = leafs.parent_id
where leafs.parent_id is null