首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现数据库引擎独立的分页?

如何实现数据库引擎独立的分页?
EN

Stack Overflow用户
提问于 2008-09-15 00:22:47
回答 6查看 2.5K关注 0票数 7

任务:实现适合不同RDBMS的数据库记录分页。方法应该适用于主流引擎- MSSQL2000+、Oracle、MySql等。

请不要发布RDBMS特定的解决方案,我知道如何在大多数现代数据库引擎中实现这一点。我在寻找通用的解决方案。目前只有临时的基于表的解决方案出现在我的脑海中。

编辑:

我在找SQL解决方案,而不是第三方库。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-09-24 10:53:47

如果SQL规范将分页作为标准,则会有一个通用的解决方案。对任何RDBMS语言称为RDBMS语言的要求也不包括分页支持。

许多数据库产品支持带有标准语言专有扩展的SQL。它们中的一些支持分页,比如使用MySQL子句的分页,用Oracle支持Rowid;每种方法都有不同的处理。其他DBMS需要添加一个名为rowid之类的字段。

我认为你不可能有一个通用的解决方案(任何人都可以在这里证明我错了;公开辩论),除非它是内置在数据库系统本身中的,或者除非有一家公司说ABC使用了甲骨文、MySQL、Server,而且他们决定让数据库开发人员为使用它的代码提供通用接口,让所有不同的数据库系统提供自己的分页实现。

票数 5
EN

Stack Overflow用户

发布于 2008-09-15 06:36:59

最自然和最有效的分页方法是使用极限/偏移量( Sybase world中的顶部)构造。DBindependent方法必须知道它运行在哪个引擎上,并应用适当的SQL结构。

至少,这是我在DB独立库的代码中看到的。使用特定的查询从引擎获得数据后,您可以将分页逻辑抽象开。

如果你真的在寻找一个单一的SQL语句解决方案,你能展示你的想法吗?与用于临时表解决方案的SQL类似。这可能会给你带来更多相关的建议。

编辑:

我想知道您在想什么,因为我找不到一种方法来处理临时表,而不使用特定于引擎的构造。您在示例中使用了特定的构造。我仍然看不到用标准SQL在数据库中实现分页的方法。您可以在应用程序中以标准SQL和页面的形式将整个表带进来,但这显然是愚蠢的。

因此,现在的问题更像是“是否有一种不使用限制/偏移或等效的实现分页的方法?”我猜答案是“理智,不。”您可以尝试使用游标,但是您也会受到数据库特定句子/行为的影响。

我刚刚想到的一个奇怪的想法是向表中添加一个页面列,比如创建表测试(id int、name varchar、phone varchar、page int),然后您可以得到带有select * from table,其中page = 1的页面1。但这意味着必须添加代码来维护该列,这同样只能通过携带整个数据库或使用特定于数据库的结构来完成。除了必须为每个可能的排序和许多其他缺陷添加一个不同的列之外。

我不能提供证据,但我真的认为你不能理智地这样做。

票数 3
EN

Stack Overflow用户

发布于 2008-09-15 07:05:03

照常进行:

从按照标准执行开始。然后处理不执行标准的角点情况,即DBMSes。如何处理这些问题取决于您的开发环境。

你在寻找一种“普遍”的方法。最普遍的分页方式是通过使用游标,但是基于游标的分页并不适合像web应用程序这样的无状态环境。

我在这里写过关于标准和实现(包括游标)的文章:http://troels.arvin.dk/db/rdbms/#select-limit-offset

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档