mysql-SQL在每个SELECT请求上获取ROW_NUMBER和COUNT

我正在建立一种网格机制,我需要从数据库中检索找到的总数或记录中的数据,只检索其中包含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

上一篇:vim中的ctrl+s导致的“假死”、无响应、不接受输入


下一篇:使用Oracle BBED修改Oracle11g数据库实例名称