在Oracle中如何按行id排序



我有一个名为points的表。我执行了下面的查询,并期望得到一个ROWID的字典排序列表,但这并没有发生。Order by rowid如何对行进行排序?

select rowid from points order by rowid

我有过类似的争吵

  1. AAAE6MAAFAAABiSAAA
  2. AAAE6MAAFAAABi+AA

第二行在字典上比第一行小。那么,如果不是毒理学分类,那么分类标准是什么呢?

您看到的只是用于显示目的的表示。

实际的rowid包含关于数据块、块中的行、块所在的文件和表的内部对象id的二进制信息(有关详细信息,请参阅手册)

使用order by rowid时,Oracle会根据(内部)信息而不是"字符串表示"对行进行排序。

如果您将查询更改为:

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

您很可能会看到行号排序背后的逻辑。

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

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

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

相关内容

  • 没有找到相关文章