3

首先,我对 postgresql 没有太多经验,所以我提前道歉。我最近将我的服务器从 postgresql 8.3 版升级到了 9 版,在恢复我的数据后,我在一个无法解决的查询中遇到了操作员问题。我正在尝试查询:

database=# select bbox from dems order by bbox using >> limit 1;

bbox 是我的表中的一列 dems 类型的 box。

我得到结果:

错误:运算符 >> 不是有效的排序运算符

第1行:使用>>limit 1从dems order by bbox中选择bbox;

提示:排序运算符必须是 btree 运算符族的“<”或“>”成员。

我认为“>>”运算符内置在 postgresql 中用于类型框,我想知道我在这里做错了什么。该查询与 8.3 版完美配合。我的老同事编写了原始代码并设置了服务器,所以我可能会遗漏一些恢复步骤。任何帮助都会很棒,同时我将继续阅读文档。

谢谢!

4

1 回答 1

0

您的基本问题是您似乎试图通过简单地对它们进行排序来生成包含框的树。订购不是做到这一点的方法。而是使用递归查询和窗口函数(两者都需要 8.4 或更高版本的 iirc)。在这种情况下,类似于:

WITH RECURSIVE bbox_tree (id, bbox, level, position, path) AS
( select id, bbox, 1, rownumber() over (order by id), id::text
   from dems
  UNION ALL
 SELECT d.id, d.bbox, t.level + 1, rownumber over (partition by t.id order by d.id),
        p.path || ',' d.id
   FROM dems d
   JOIN bbox_tree t ON t.bbox >> d.bbox )
SELECT bbox FROM  bbox_tree order by string_to_array(t.path, ',');

您实际上将不得不在这里创建一棵树。

于 2013-02-14T02:03:32.870 回答