gpt4 book ai didi

sql - Oracle和sql server分页以及通用分页方法

转载 作者:行者123 更新时间:2023-12-02 14:12:36 26 4
gpt4 key购买 nike

我想在 gridview 或 html 表中实现分页,我将使用 ajax 填充这些表。我应该如何编写查询来支持分页?例如,如果页面大小为 20,并且当用户单击第 3 页时,则表中必须显示 41 到 60 之间的行。起初我可以获取所有记录并将它们放入缓存中,但我认为这是错误的方法。因为数据可能非常庞大,并且数据可能会从其他 session 中更改。那么我该如何实现呢?有没有通用的方法(适用于所有数据库)?

最佳答案

正如其他人所建议的,您可以在 Oracle 中使用 rownum。但这有点棘手,您必须将查询嵌套两次。

例如,对查询进行分页

select first_name from some_table order by first_name

你需要像这样嵌套它

select first_name from
(select rownum as rn, first_name from
(select first_name from some_table order by first_name)
) where rn > 100 and rn <= 200

原因是 rownum 是在 where 子句之后和 order by 子句之前确定的。要明白我的意思,你可以查询

select rownum,first_name from some_table order by first_name

你可能会得到

4   Diane
2 Norm
3 Sam
1 Woody

这是因为 oracle 计算 where 子句(本例中没有),然后分配 rownums,然后按first_name 对结果进行排序。您必须嵌套查询,以便它使用行排序后分配的 rownum。

第二个嵌套与在 where 条件下如何处理 rownum 有关。基本上,如果您查询“where rownum > 100”,那么您不会得到任何结果。这是先有鸡还是先有蛋的问题,在找到 rownum > 100 之前它无法返回任何行,但由于它不返回任何行,所以它永远不会增加 rownum,所以它永远不会计数到 100。呃。第二层嵌套解决了这个问题。请注意,此时它必须为 rownum 列起别名。

最后,您的 order by 子句必须使查询具有确定性。例如,如果您有 John Doe 和 John Smith,并且您仅按名字排序,则两者可以将位置从一次查询执行切换到下一次查询执行。

这里有文章http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html在这里 http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html 。现在我看到我的帖子有多长,我可能应该刚刚发布这些链接......

关于sql - Oracle和sql server分页以及通用分页方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com