我有一些SQL表,比如说只有一列c1:
c1 |
---|
10 |
3 |
1 |
10 |
5 |
关系数据库中没有"行索引"(注意关系数据库包含行,而不是"记录"),但如果您可以找到一列来对结果进行排序,则可以使用窗口函数轻松完成:
select c1,
row_number() over (order by some_column) as record_index
from the_table
order by record_index;
(您没有指定DBMS,以上是ANSI SQL)
编辑
如果没有要排序的列,可以尝试按常数值排序,这将使行"无序":
select record_index,
row_number() over (order by 42) as record_index
from the_table
order by record_index;
但再次强调:不存在行的"自然"顺序。磁盘上可能有,但很可能不是在检索过程中使用的,尤其是当表没有聚集索引时(Oracle默认不使用聚集索引,Postgres根本没有聚集索引)。
当检索数据时,DBMS还可能应用额外的优化。Oracle、Postgres和我相信SQL Server也可以从不同的会话"跳"到表扫描上,以优化从磁盘读取的物理数据。在这种情况下,两个并发选择将显示不同的"顺序",即使硬盘上的phyiscal布局没有改变。
然后,由于更新,物理存储发生了更改(例如,如果一行由于其大小增加而不再适合块)。
灵感来自@a_hors_with_no_name的答案…:
SELECT
c1,
row_number() OVER (ORDER BY dummy)-1 AS record_index
FROM
(SELECT
c1,
42 AS dummy
FROM t1
) AS t1_augmented;
(当然要注意row_number()的结果是基于1的。)