SQL语句生成一列,该列的值为记录索引



我有一些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的。)

最新更新