我正在建立一种网格机制,我需要从数据库中检索找到的总数或记录中的数据,只检索其中包含row_number的这些记录的范围.
我正在使用SqlServer进行测试,但是我也需要在Oracle和MySql上提供支持.
这就是我正在尝试的方法,但是我无法使其工作:
SELECT * FROM
(SELECT ROW_NUMBER() AS RN,
COUNT(*) AS TOTALCN,
Id,
Name,
Phone
FROM MyTable WHERE Deleted='F')
WHERE RN > 100 AND RN < 150;
这个想法是:
MyTable -> number of records: 1000
Select Id, Name, Phone from MyTable where Deleted='F' -> number of records: 850
Get the records 100 to 150 from the 850.
我想要一个像这样的选择:
RN TOTALCN Id Name Phone
1 850 Data Data Data
2 850 Data Data Data
3 850 Data Data Data
4 850 Data Data Data
5 850 Data Data Data
6 850 Data Data Data
CN(850)将成为我的网格记录总数.
RN将是数据的网格索引.
有人可以帮我实现这一目标吗?
谢谢你的帮助.
[编辑]
因此,我将在每个SELECT字段上添加一个ORDER BY.这是我到目前为止所得到的:
SELECT * FROM (SELECT ROW_NUMBER()
OVER (ORDER BY ID) AS RN,
COUNT(*) OVER (ORDER BY (SELECT NULL) AS CNT)
Id, Name Phone FROM MyTable WHERE Deleted='F')
T WHERE RN > 100 AND RN < 500;
我要走正确的路吗?
这对SQL来说将有多昂贵?
解决方法:
在同一个SELECT子句中包含一堆详细信息行的情况下包含COUNT(*)将失败.这是因为COUNT(*)是一个聚合函数.在没有GROUP BY的情况下,它仅返回其结果集中的一行.因此,您需要在自己的SELECT语句中查询计数.
SQL Server具有ROW_NUMBER()函数. Oracle具有一个名为ROWNUM的伪列. MySQL对于获取行号确实是个悲惨的黑客.在这里描述. MySQL – Get row number on select