2016-11-02 34 views
0

JDBC驅動程序不支持ROW_NUMBER函數。從表中讀取數據時,如何從1到n獲取行ID?從1到n獲取rowid進行中OpenEdge數據庫

如果我有一個包含2列作爲名和姓的表,那麼我在SQL Server中運行一個類似於「SELECT ROW_NUMBER()OVER(ORDER BY(SELECT NULL))AS rowid,* FROM tableName」的查詢。這會給我rowid從1到n以及ResultSet中的名字和姓氏的內容。

所以我會得到這樣一個結果:

1,菲利克斯,曹

2,傑克,陳

3,尼克,何

我想爲OpenEdge數據庫做一個類似的查詢,這樣我就可以按照上面的順序得到rowid。

+0

不,你似乎並不真正瞭解ROWID是什麼。我認爲你需要解釋你想解決的問題! – Jensd

+0

好的,我會再次提出這個問題。 –

+0

看來您的真正需求與ROWID無關,而且實際要求是您希望您的結果集按順序枚舉? –

回答

3

不,在OpenEdge數據庫中沒有等效於ROW_NUMBER的值。

http://knowledgebase.progress.com/articles/Article/Is-ORACLE-row-number-function-supported-in-OpenEdge

關於ROWID:

撇開的它是否是一個好主意,想的ROWID爲整數的討論......(你應該重新閱讀鏈接kbase)

不能保證任何特定的ROWID值將永遠存在,並且沒有理由ROWID應該以零或一個或任何其他值開始。

如果您認爲ROWID和RECID排序相同,並且RECID是由塊#和該塊內的某個位置組成的整數, ROWID 0仍然不會存在,因爲存儲區的第一部分是控制數據 - 沒有行存儲在那裏。

您可以使用ROWID或RECID的猜測(或通過枚舉每個可能的值)成功掃描表,但必須準備好處理差距。例如,當試圖從損壞的數據庫中恢復數據時,這可能很有用。但這不是人們通常會做的事情。

我認爲你已經決定ROWID是解決你遇到的問題,但真正的問題不是「如何獲得ROWID 0」。如果我不得不猜測,我猜你可能試圖獲得批量N的結果集。在這種情況下,你應該看看這個:How to mimic SELECT ... LIMIT, OFFSET in OpenEdge SQL?

+0

對不起,我不該說0。你說得對,0永遠不會存在。 ROWID給出了唯一的數字,我知道它正在增加1.我只是希望它從1開始,而不是一些隨機數。感謝您的回答 –

+0

您不應該將ROWID看作整數,但是,除此之外,ROWID不會增加1或任何其他值。 ROWID的價值是不可預測的。最高值和最低值之間會有差距,您的代碼必須接受該事實,否則將無法工作。 –

+0

我看到了,我只測試了一些記錄,我認爲這個數字會增加1.如果有差距,那麼我的應用程序根本不能使用ROWID。 –