2012-07-20 113 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, ','); 

您實際上將不得不在這裏創建一棵樹。