8

我有一个带有 ltree 路径列的表。在我的层次结构中,标签的路径是唯一的,这意味着每个标签都只有一个父标签。换句话说,表中没有两条以相同标签结尾的 ltree 路径。

我有一个 ltree 标签,比如说“C”。

我可以使用以下查询找到此标签的所有后代行:

select * from myTree where path ~ '*.C.*';

这工作正常并给出正确的子树。

现在我需要实现查询来查找这个给定标签的所有祖先行。我的意思是,例如,如果表中有 3 行标签为“A”、“AB”、“ABC”,我想获取路径为“A”和“AB”的行(可能包括“ABC”本身,暂时无所谓)。

如果我知道“C”的完整路径(上例中的“ABC”),那么@>操作员的任务很容易。但是,现在我只知道“C”,我仍然想通过单个查询来完成任务。有没有办法做到这一点?

4

2 回答 2

19
SELECT
  *
FROM
  myTree
WHERE
  path @> (
    SELECT
      path
    FROM
      myTree
    WHERE
      label = 'C'
  );
于 2014-11-26T11:46:14.787 回答
0

像这样的东西:

WITH r AS
(
    SELECT *, row_number() OVER (ORDER BY path) rn
      FROM myTree
)
SELECT *
  FROM r
 WHERE rn <= (SELECT rn FROM r WHERE path ~ '*.C');

SQL Fiddle

不过,也许有更好的方法使用内置的东西。

于 2014-11-26T11:30:14.973 回答