这几天遇到了一个问题,使用sqlite怎样取得结果集的行号?
sqlite中无法使用ROWNUM(),有的网友建议使用rowid。但rowid记录的是原表中的行号,并不是查询结果集的行号。
在网上查了好久也没有找到合适的解决问题方法。
后来终于在一个英文网站上找到了完美解决问题方法,分享出来,希望广大中国网友通过中文也能检索到这个方法。
【问题描述】
有这样一个sqlite database table
rowid | name
-------------
1 | John Doe
2 | Jane Smith
3 | Aaa
4 | Baaaaa
5 | Caa
6 | Dddd
7 | Eeeee
8 | Ffff
9 | Ggggg
10 | Hhhh
11 | Iiiii
12 | Jjj
13 | Kkkk
对该表按照name进行排序,rowid记录的是原表中的实际行号
rowid | name
-------------
3 | Aaa
4 | Baaaaa
5 | Caa
6 | Dddd
7 | Eeeee
8 | Ffff
9 | Ggggg
10 | Hhhh
11 | Iiiii
2 | Jane Smith
12 | Jjj
1 | John Doe
13 | Kkkk
【期望结果】
期望得到查询结果集的逻辑行号,如下面的rowNum
rowid | name | rowNum
---------------------------
3 | Aaa | 1
4 | Baaaaa | 2
5 | Caa | 3
6 | Dddd | 4
7 | Eeeee | 5
8 | Ffff | 6
9 | Ggggg | 7
10 | Hhhh | 8
11 | Iiiii | 9
2 | Jane Smith | 10
12 | Jjj | 11
1 | John Doe | 12
13 | Kkkk | 13
【解决办法】
SELECT
(SELECT COUNT(*)
FROM Names AS t2
WHERE t2.name < t1.name
) + (
SELECT COUNT(*)
FROM Names AS t3
WHERE t3.name = t1.name AND t3.id < t1.id
) + 1 AS rowNum,
id,
name
FROM Names t1
ORDER BY t1.name ASC