是否有一种简单的方法可以从返回(可能)同一子树的多个后代节点的查询中选择子树(PostgreSQL ltree)的根节点?我已经实现了一个相当冗长的算法来完成这个任务(大约 40 行,缩进和格式化),但是如果我可以利用 ltree 数据实际上是树并且具有易于访问的根节点这一事实,那就太棒了。需要注意的是,单个查询可能会返回多个不同的子树根,因此我不能仅仅对数据进行排序并获取顶部结果。
2012 年 6 月 7 日:我已将查询更新为我的最新版本,这将时间复杂度降低了一半。它使用自反连接(如果您愿意的话)从子树中删除所有在子树中有祖先的节点。
本质上,我的算法如下工作:
WITH roots AS
(
/* Place any query here, which returns a field "ancestry" of type ltree */
)
SELECT roots.*
FROM roots
WHERE NOT EXISTS
(
SELECT 1
FROM roots AS ancestors
WHERE ancestors.ancestry @> roots.ancestry
AND ancestors.id <> roots.id
);
(更多细节请看我的要点,这里:https ://gist.github.com/1507368 )