2012-07-20 67 views
3

首先我对postgresql不太熟悉,所以我对高级的道歉。我最近将我的服务器从postgresql版本8.3升级到了版本9,在恢复我的数据后,我遇到了一个问题,在我的一个查询中我遇到了一个问题,这是我无法解决的。我正在查询:PostgreSQL错误:运算符>>不是有效的排序运算符

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

bbox是我的表格中的一列,表示类型框的列表。

我得到的结果:

Error: operator >> is not a valid ordering operator

Line 1: select bbox from dems order by bbox using >> limit 1;

HINT: Ordering operators must be "<" or ">" memeber of btree operator families.

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

谢谢!

+0

我不认为'>>'是一个排序操作符,因为'a'<< b', 'a >> b'或'a = b'都不是真的。 – 2012-07-20 19:20:35

+0

我写过关于'ORDER BY ..使用...'[over here](http://stackoverflow.com/a/7461843/947357)。也许它可以帮助你理解在旧系统中寻找缺失部分的位置。 – 2012-07-23 08:15:46

回答

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, ','); 

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