Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Oracle的同一SQL查询获取总结果计数和给定的子集(“结果页”)_Sql_Oracle_Pagination - Fatal编程技术网

如何使用Oracle的同一SQL查询获取总结果计数和给定的子集(“结果页”)

如何使用Oracle的同一SQL查询获取总结果计数和给定的子集(“结果页”),sql,oracle,pagination,Sql,Oracle,Pagination,我想显示一个结果表。数据来源于Oracle数据库上的SQL查询。我想显示一页的结果,比如说,一次显示10条记录,最大限度地减少发送到前端的实际数据 同时,我想显示可能结果的总数,比如说,显示123个结果中的1-10个,并允许分页,比如,计算每页10个,123个结果,因此是13页 我可以通过单个计数查询获得结果的总数 我可以通过另一个查询得到所需的子集 SELECT * FROM ... etc. WHERE ? <= ROWNUM AND ROWNUM < ? 但是,有没有一种方法

我想显示一个结果表。数据来源于Oracle数据库上的SQL查询。我想显示一页的结果,比如说,一次显示10条记录,最大限度地减少发送到前端的实际数据

同时,我想显示可能结果的总数,比如说,显示123个结果中的1-10个,并允许分页,比如,计算每页10个,123个结果,因此是13页

我可以通过单个计数查询获得结果的总数

我可以通过另一个查询得到所需的子集

SELECT * FROM ... etc. WHERE ? <= ROWNUM AND ROWNUM < ?
但是,有没有一种方法可以在一个查询中获得所有相关的详细信息

更新
实际上,上面使用ROWNUM的查询似乎适用于0-10,但不适用于10-20,所以我如何才能做到这一点呢?

您可以在表上使用内部联接并获取子查询中的结果总数。查询示例如下所示:

SELECT E.emp_name, E.emp_age, E.emp_sal, E.emp_count
  FROM EMP as E 
 INNER JOIN (SELECT emp_name, COUNT(*) As emp_count
               FROM EMP GROUP BY emp_name) AS T
    ON E.emp_name = T.emp_name WHERE E.emp_age < 35;

您可以在表上使用内部联接,并在子查询中获取结果的总数。查询示例如下所示:

SELECT E.emp_name, E.emp_age, E.emp_sal, E.emp_count
  FROM EMP as E 
 INNER JOIN (SELECT emp_name, COUNT(*) As emp_count
               FROM EMP GROUP BY emp_name) AS T
    ON E.emp_name = T.emp_name WHERE E.emp_age < 35;

根据您的问题措辞,不确定您想要的是什么,但您似乎希望看到包含两个值之间行号的所有记录的专用表,并在每个记录的相邻字段中查看记录总数。如果是这样,您可以尝试从表中选择所有内容,并通过说出where 1=1将一个计数值的子查询连接为一个字段,即处处将该字段固定到记录上。例如:

SELECT *
FROM table_name LEFT JOIN (SELECT COUNT(*) AS NUM_RESULTS FROM table_name) ON 1=1
WHERE ? <= ROWNUM AND ROWNUM < ?

根据您的问题措辞,不确定您想要的是什么,但您似乎希望看到包含两个值之间行号的所有记录的专用表,并在每个记录的相邻字段中查看记录总数。如果是这样,您可以尝试从表中选择所有内容,并通过说出where 1=1将一个计数值的子查询连接为一个字段,即处处将该字段固定到记录上。例如:

SELECT *
FROM table_name LEFT JOIN (SELECT COUNT(*) AS NUM_RESULTS FROM table_name) ON 1=1
WHERE ? <= ROWNUM AND ROWNUM < ?

ROWNUM的使用有点棘手。 对于实际获取的第一个结果,ROWNUM伪列始终以1开头。如果筛选ROWNUM>10,则永远不会获取任何结果,因此也不会获得任何结果

如果不希望将其用于分页,则需要嵌套子查询:

select * from 
   (select rownum n, x.* from 
     (select * from mytable order by name) x
   )
   where n between 3 and 5;
请注意,您需要另一个嵌套子查询来正确获取订单;如果你把订单提高一级

select * from 
   (select rownum n, x.* from mytable x order by name)
   where n between 3 and 5;
它将选择3个随机*行并对它们进行排序,但这通常不是您想要的

*不是随机的,但可能不是你所期望的


有关实现分页的更有效方法,请参阅。

ROWNUM使用起来有点棘手。 对于实际获取的第一个结果,ROWNUM伪列始终以1开头。如果筛选ROWNUM>10,则永远不会获取任何结果,因此也不会获得任何结果

如果不希望将其用于分页,则需要嵌套子查询:

select * from 
   (select rownum n, x.* from 
     (select * from mytable order by name) x
   )
   where n between 3 and 5;
请注意,您需要另一个嵌套子查询来正确获取订单;如果你把订单提高一级

select * from 
   (select rownum n, x.* from mytable x order by name)
   where n between 3 and 5;
它将选择3个随机*行并对它们进行排序,但这通常不是您想要的

*不是随机的,但可能不是你所期望的


有关实现分页的更有效方法,请参阅。

ROW_NUM函数与ROWNUM有何不同?ROW_NUM函数与ROWNUM有何不同?