首先,我对postgresql没有太多经验,所以我先生道歉。我最近将我的服务器从postgresql版本8.3升级到版本9,在恢复我的数据后,我遇到了一个我无法解决的查询中的运算符问题。我想查询:
database =#使用>>选择bbox从dems订购bbox限制1;
bbox是我的表dems类型框中的一列。
我得到结果:
错误:运算符>>不是有效的订购运营商
第1行:使用>>通过bbox从dems订单中选择bbox限制1;
提示:订购运营商必须是“<”或“>” btree运营商家庭的成员。
我以为“>>”运算符内置到postgresql类型框中,我想知道我在这里做错了什么。该查询与8.3版完美配合。我的老同事编写了原始代码并设置了服务器,因此我可能缺少一些恢复步骤。任何帮助都会很棒,我会在同一时间继续阅读文档。
谢谢!
答案 0 :(得分: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, ',');
你实际上必须在这里创建一个树。