我有一个带有ltree路径列的表。在我的层次结构中,标签的路径是唯一的,这意味着每个标签都只有一个父标签。换句话说,表中没有两个以相同标签结尾的ltree路径。
我有一个ltree标签,让我们说“C”。
我可以使用以下查询找到此标签的所有后代行:
select * from myTree where path ~ '*.C.*';
这样可以正常工作并提供正确的子树。
现在我需要实现查询以查找此给定标签的所有祖先行。我的意思是如果表中有3行标有“A”,“AB”,“ABC”,我想得到路径为“A”和“AB”的行(可能包括“ABC”本身,现在没关系。)
如果我知道“C”的完整路径(上例中的“A.B.C”),那么使用@>
运算符可以轻松完成任务。但是,现在我只知道“C”,我仍然希望通过单个查询来完成任务。有没有办法做到这一点?
答案 0 :(得分:13)
SELECT
*
FROM
myTree
WHERE
path @> (
SELECT
path
FROM
myTree
WHERE
label = 'C'
);
答案 1 :(得分: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 强>
可能有更好的方法使用内置的东西。