有没有一种简单的方法可以从返回(可能)同一子树的几个子节点的查询中选择子树的根节点(PostgreSQL ltree)?我已经实现了一个相当详细的算法来实现这个任务(大约40行,缩进和格式化),但是如果我能利用ltree数据实际上是树并且有一个容易访问的根节点这一事实,那就太棒了。需要注意的是,一个查询可能返回几个不同的子树根,因此我不能仅仅对数据进行排序并获取最上面的结果。
六月07, 2012:我把查询更新到我的最新版本,它把时间复杂度减少了一半。它使用一个自反连接(如果愿意的话)从子树中移除所有在子树中有祖先的节点。
基本上,我的算法工作如下:
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)
最佳答案
你就不能用subpath()函数吗?
SELECT
SUBPATH(ancestry, 0, 1)
FROM
some_table;
关于sql - 从子树(PostgreSQL ltree)查询中选择根节点,该查询返回多个后代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8580003/