SQLITE等效于Oracle的ROWNUM?

wvt8vs2t  于 2023-04-30  发布在  SQLite
关注(0)|答案(5)|浏览(208)

我在SQLite3中的表中添加了一个“index”列,通过重命名旧数据库并在其位置上创建一个新数据库来允许用户轻松地对数据进行重新排序。
我遇到的问题是,当我INSERT时,我需要在“index”列中为每行提供一个唯一的数字。..选择旧值。
我在Oracle中搜索了一个有用的术语ROWNUM,但是SQLite3没有这个术语。SQLite中是否有等效的东西?

eit6fx6z

eit6fx6z1#

您可以使用特殊的行名称ROWIDOID_ROWID_之一来获取列的rowid。Seewww.example. www.example.com 了解更多细节(行可以被称为ROWID等的普通列隐藏)。

2cmtqfgy

2cmtqfgy2#

这里的许多人似乎将ROWNUMROWID混淆。它们不是同一个概念,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;
irlmq6kh

irlmq6kh3#

没有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的“前一个”值。

xdnvmnnf

xdnvmnnf4#

我相信你想在SQLite中使用约束LIMIT。SELECT * FROM TABLE可以返回数千条记录。但是,您可以通过添加LIMIT关键字来限制此操作。
SELECT * FROM TABLE LIMIT 5;将返回查询中返回的表中的前5条记录-如果可用

2nbm6dog

2nbm6dog5#

使用此代码创建Row_num 0。...count_row

SELECT (SELECT COUNT(*)
FROM main AS t2
WHERE t2.col1 < t1.col1) + (SELECT COUNT(*) 
  FROM main AS t3 
  WHERE t3.col1 = t1.col1 AND t3.col1 < t1.col1) AS rowNum, * FROM Table_name t1  WHERE rowNum=0 ORDER BY t1.col1 ASC

相关问题