在 Oracle 中如何按行 ID 排序?
How does order by row id work in Oracle?
我有一个table叫积分。我执行了以下查询,并期望得到一个按字典顺序排序的 ROWID 列表列表,但这并没有发生。 Order by rowid 如何对行进行排序?
select rowid from points order by rowid
我有如下几行
- AAAE6MAAFAAAABiSAAA
- AAAE6MAAFAAABi+AAA
第二行在字典序上比第一行小。那么如果不是词典排序,排序标准是什么?
rowid的顺序不保证。这取决于您如何设置 NLS 设置。 rowid 也表示数据库中行的物理分配。 rowid 被认为是不可变的(不会改变)但是如果你删除一行并再次插入它然后它会改变。
If you delete a row, then Oracle may reassign its rowid to a new row
inserted later.
为什么你看到的只是用于显示目的的表示。
实际的rowid包含数据块的二进制信息,块中的行,块所在的文件和table(See the manual for details)
当您使用 order by rowid
时,Oracle 根据该(内部)信息而不是 "string representation" 对行进行排序。
如果您将查询更改为:
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()
的值将始终相同。如果您的 table 中只有两行,那么这两行很可能也具有相同的 rowid_block_number()
值
我有一个table叫积分。我执行了以下查询,并期望得到一个按字典顺序排序的 ROWID 列表列表,但这并没有发生。 Order by rowid 如何对行进行排序?
select rowid from points order by rowid
我有如下几行
- AAAE6MAAFAAAABiSAAA
- AAAE6MAAFAAABi+AAA
第二行在字典序上比第一行小。那么如果不是词典排序,排序标准是什么?
rowid的顺序不保证。这取决于您如何设置 NLS 设置。 rowid 也表示数据库中行的物理分配。 rowid 被认为是不可变的(不会改变)但是如果你删除一行并再次插入它然后它会改变。
If you delete a row, then Oracle may reassign its rowid to a new row inserted later.
为什么你看到的只是用于显示目的的表示。
实际的rowid包含数据块的二进制信息,块中的行,块所在的文件和table(See the manual for details)
当您使用 order by rowid
时,Oracle 根据该(内部)信息而不是 "string representation" 对行进行排序。
如果您将查询更改为:
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()
的值将始终相同。如果您的 table 中只有两行,那么这两行很可能也具有相同的 rowid_block_number()