2016-01-12 19 views
0

我有一张叫做点的表格。我执行了下面的查询,并期望列表式的排序列表的ROWIDs,但没有发生。 Order by rowid如何对行进行排序?如何通过行ID在Oracle中工作?

select rowid from points order by rowid 

我行像以下

  1. AAAE6MAAFAAABiSAAA
  2. AAAE6MAAFAAABi + AAA

第二排是lexicographicaly比第一排小。那么,如果不是词法排序,那么排序标准是什么?

+1

它是一个伪列。没有排序标准,所以你不应该依赖这些ID。更重要的是,例如,如果您要移动表格,这些ID可能会发生变化。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm – stee1rat

+1

第二个肯定不完全正确。 '第二行比第一行的字典小.'对于oracle数据库,它将取决于一些NLS数据库设置。 –

+0

基本上你不应该使用'rowid'进行排序,没有可能出现的情况我可以想到,这对于通过'rowid'进行排序是有用的 – simsim

回答

9

为什么你看到只是一个用于显示目的的表示。

实际ROWID包含有关数据块的二进制信息,该块中的行,其中块所在的文件和表的内部对象ID(See the manual for details

当您使用order by rowid甲骨文排序基于该(内部)信息的行,不基于“字符串表示”。

如果你改变你的查询:

select rowid, 
     dbms_rowid.rowid_relative_fno(rowid) as rel_fno, 
     dbms_rowid.rowid_row_number(rowid) as row_num, 
     dbms_rowid.rowid_block_number(rowid) as block_num, 
     dbms_rowid.rowid_object(rowid) 
from points 
order by rowid 

您将最有可能看到ROWNUMBER的顺序背后的逻辑。

请注意,dbms_rowid.rowid_object()的值将始终相同。如果你的表中只有两行,两者最有可能也有相同的值rowid_block_number()

+0

我将我的选票保存在答案中,以便稍后尝试追求金徽章,但不禁对这个深刻的答案进行投票! :) – simsim

+1

这是一个非常好的答案。但是,你有没有任何想法为什么字符串表示不保留原来的顺序?做一个字符串表示不应该很难。 –

+0

@戈登林诺夫:对不起,没有想法。我*猜测*字符串表示只是连接十六进制值 - 但可能不是以单个元素用于比较的顺序。 –

1

rowid的序列不保证。这取决于您如何设置NLS设置。 rowid也表示数据库中该行的物理分配。 rowid被认为是不可变的(不会改变),但是如果你删除一行并再次插入,那么它就会改变。

如果删除一行,Oracle可能会将其rowid重新分配到稍后插入的新行 。