Postgres 中的 LTREE 祖先查询未按预期工作

Posted

技术标签:

【中文标题】Postgres 中的 LTREE 祖先查询未按预期工作【英文标题】:LTREE ancestor query in Postgres not working as expected 【发布时间】:2020-03-18 18:25:23 【问题描述】:

我有一个带有LTREE 列的表,数据如下所述。

ID  Label  Path
1.  ABC.   1
2.  DEF.   1.2
26. GHI.   1.2.26

假设我想找到标记为GHI 的节点的所有祖先。我正在使用的查询是

SELECT *
    FROM
        my_table as tbl
    WHERE
        tbl.path @> (
            SELECT
                path 
            FROM
                my_table 
            WHERE
                id=26
        ) 

但是,这仅返回最后一行,而我想要所有三行。我做错了什么?

【问题讨论】:

【参考方案1】:

我也是 Ltree 的新手,但我想我可以帮助你!

您的设置应与 Ltree 的 GIST 索引匹配。 请参阅官方文档的F.21.3 部分。 https://www.postgresql.org/docs/current/ltree.html

我相信没有它,运营商无法正确地弄清楚你想要什么。除此之外,查询似乎是正确的。我在本地环境中运行了相同的代码(尽管我使用的是最新版本的 Postgres)。

【讨论】:

【参考方案2】:

要查找给定路径的所有后代,请使用

SELECT *
FROM my_table as tbl
WHERE path <@ '1.12.26'

欲了解更多信息https://www.postgresql.org/docs/current/ltree.html#LTREE-OP-TABLE

【讨论】:

以上是关于Postgres 中的 LTREE 祖先查询未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 递归 LTREE 查找

Postgres - 使用 ltree 计算级别(下)的孩子

Postgres ltree 不使用 Gist 索引 为啥?

MySQL 索引未按预期使用

在 Postgres 13 中未按预期工作的表设置默认权限

postgreSQL ltree工具获取上下级