从子树(PostgreSQL ltree)查询中选择根节点,它返回几个后代



是否有一种简单的方法来选择子树(PostgreSQL ltree)的根节点从查询返回(潜在的)几个后代节点的同一子树?我已经实现了一个相当冗长的算法来完成这个任务(大约40行,缩进和格式化),但是如果我能够利用ltree数据实际上是树并且具有易于访问的根节点这一事实,那就太棒了。重要的是要注意,单个查询可能会返回几个不同的子树根,因此我不能仅仅对数据进行排序并获取最上面的结果。

June 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;

最新更新