SQLITE相当于Oracle的ROWNUM?

时间:2012-09-02 02:57:45

标签: sqlite insert-select

我正在向SQLite3中的表添加一个“索引”列,以允许用户轻松地对数据进行重新排序,方法是重命名旧数据库并使用额外列创建一个新数据库。

我遇到的问题是,当我INSERT ... SELECT旧值时,我需要在'index'列中为每一行赋一个唯一的数字。

我确实在Oracle中发现了一个名为ROWNUM的有用术语,但SQLite3没有。在SQLite中有相同的东西吗?

5 个答案:

答案 0 :(得分:11)

您可以使用其中一个特殊行名ROWIDOID_ROWID_来获取列的rowid。有关详细信息,请参阅http://www.sqlite.org/lang_createtable.html#rowid(并且可以通过名为ROWID的普通列隐藏行等等。

答案 1 :(得分:8)

没有SQLite没有直接等同于Oracle的ROWNUM。

如果我正确理解您的要求,您应该能够以这种方式基于旧表的排序添加编号列:

create table old (col1, col2);

insert into old values
    ('d', 3),
    ('s', 3),
    ('d', 1),
    ('w', 45),
    ('b', 5465),
    ('w', 3),
    ('b', 23);

create table new (colPK INTEGER PRIMARY KEY AUTOINCREMENT, col1, col2);

insert into new select NULL, col1, col2 from old order by col1, col2;

新表包含:

.headers on
.mode column

select * from new;

colPK       col1        col2      
----------  ----------  ----------
1           b           23        
2           b           5465      
3           d           1         
4           d           3         
5           s           3         
6           w           3         
7           w           45

AUTOINCREMENT按照其名称暗示:每增加一行,前一个'值增加1。

答案 2 :(得分:2)

这里的许多人似乎将 ROWNUM ROWID 混合在一起。它们的概念不同,Oracle两者都有。

ROWID 是数据库ROW的唯一ID。它几乎是不变的(在导入/导出过程中有所变化,但在不同的SQL查询中相同)。

ROWNUM 是与查询结果中的行号相对应的计算字段。第一行始终为1,第二行始终为2,依此类推。它绝对不会链接到任何表行,并且同一表行的行数可能会非常不同,具体取决于查询方式。

Sqlite具有ROWID,但没有ROWNUM。我发现的唯一等效项是 ROW_NUMBER()函数(请参见http://www.sqlitetutorial.net/sqlite-window-functions/sqlite-row_number/)。

您可以通过以下查询来实现所需的目标:

insert into new 
    select *, row_number() over () 
    from old;

答案 3 :(得分:0)

select rowid, * from exampleTable

sqlite已经为你添加了rowid,不需要两次做同样的事情。请注意,在大量插入后,sidite将重新使用rowid,当旧的插入被删除时。

答案 4 :(得分:0)

我相信您想在SQLite中使用限制LIMIT。 Class 'Iterable' does not define '__getitem__', so the '[]' operator cannot be used on its instances 可以返回数千条记录。 但是,您可以通过添加SELECT * FROM TABLE关键字来限制这一点。

LIMIT 将返回查询中返回的表中的前5条记录-如果有

相关问题