SQLite:如何获取绝对行号

时间:2015-12-08 23:29:49

标签: perl sqlite

我试图获取查询返回的行的绝对记录号(在Perl中)。让我们说我查询我的表如下:

my $stmt = "SELECT * FROM MAIN WHERE item='widget' LIMIT 1;";
my $sth  = $dbh->prepare( $stmt );
my $rv   = $sth->execute();

如何找出返回行的绝对行号?我尝试使用ROWID:

my $stmt = "SELECT ROWID, * FROM MAIN WHERE item='widget' ORDER BY ROWID LIMIT 1;";
my $sth  = $dbh->prepare( $stmt );
my $rv   = $sth->execute();
my $row  = $sth->fetchrow_hashref();

if( defined( $row ) ) {
  $RecordNumber = $row->{'rowid'};
}

如果您从未删除表中的行,则此方法有效。

但行ID永远不会改变。因此,如果从表中删除行,则rowid不再与表中的绝对行号匹配。

我希望我的问题很明确(英语不是我的母语)。

1 个答案:

答案 0 :(得分:1)

让我们举个例子

sqlite> create table my_example (field1);
sqlite> insert into my_example values ('abc');
sqlite> insert into my_example values ('booooo');
sqlite> insert into my_example values ('3231-556');
sqlite> .mode column
sqlite> .header on
sqlite> select * from my_example;
field1
----------
abc
booooo
3231-556
sqlite> select rowid, * from my_example;
rowid       field1
----------  ----------
1           abc
2           booooo
3           3231-556
sqlite> delete from my_example where field1='abc';
sqlite> select rowid, * from my_example;
rowid       field1
----------  ----------
2           booooo
3           3231-556
sqlite> insert into my_example values ('abc');
sqlite> select rowid, * from my_example;
rowid       field1
----------  ----------
2           booooo
3           3231-556
4           abc
sqlite>

获得我想要实现的目标(类似于rown_num)的方法是:

sqlite> select (select count(*) from my_example b where a.rowid >= b.oid ) as cnt, * from my_example a;
cnt         field1
----------  ----------
1           booooo
2           3231-556
3           abc
sqlite>

希望这会有所帮助