2016-11-02 37 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。 –