有没有一种简单的方法可以从返回(可能)同一子树的几个子节点的查询中选择子树的根节点(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/

10-15 08:05