Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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
Database 如何实现与数据库引擎无关的分页?_Database_Paging - Fatal编程技术网

Database 如何实现与数据库引擎无关的分页?

Database 如何实现与数据库引擎无关的分页?,database,paging,Database,Paging,任务:实现适合不同RDBMS的数据库记录分页。方法应该适用于主流引擎——MSSQLS2000+、Oracle、MySql等 请不要发布特定于RDBMS的解决方案,我知道如何为大多数现代数据库引擎实现这一点。我在寻找通用的解决方案。目前我只想到了临时的基于表格的解决方案 编辑: 我在寻找SQL解决方案,而不是第三方库。如果你能容忍开源,亚音速可以为你做到这一点。。。 除此之外,我知道NHib也会这样做JPA允许您使用查询类: Query q = ...; q.setFirstResult (0)

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

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

编辑:

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

如果你能容忍开源,亚音速可以为你做到这一点。。。


除此之外,我知道NHib也会这样做

JPA允许您使用查询类:

Query q = ...;
q.setFirstResult (0);
q.setMaxResults (10);
提供结果集中的前10个结果


如果您想要一个独立于DBMS的原始SQL解决方案,恐怕您运气不好。所有供应商的做法都不同。

最自然、最有效的分页方式是使用LIMIT/OFFSET(Sybase world中的TOP)构造。独立于数据库的方法必须知道它在哪个引擎上运行,并应用适当的SQL构造

至少,这是我在DB独立库代码中看到的方法。一旦使用特定查询从引擎中获取数据,就可以抽象出分页逻辑

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

编辑:

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

因此,现在的问题更像是“有没有一种方法可以实现分页而不使用限制/偏移量或等效项?”我猜答案是“理智地说,没有”。你可以尝试使用游标,但你也会成为数据库特定语句/行为的牺牲品

我刚刚想到的一个古怪(读起来很愚蠢)的想法是向表中添加一个页面列,比如说创建表测试(id int,name varchar,phone varchar,page int),然后您可以使用select*从page=1的表中获取第1页。但这意味着必须添加代码来维护该列,这同样只能通过带来整个数据库或使用特定于数据库的构造来完成。除了必须为每个可能的顺序添加不同的列,还有许多其他缺陷

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

照常进行:
首先,根据标准实施它。然后处理一些特殊情况,即未实现标准的DBMS。如何处理紧急情况取决于您的开发环境

您正在寻找一种“通用”方法。分页最普遍的方法是使用游标,但基于游标的分页不太适合web应用程序等非状态环境

我已经在这里介绍了标准和实现(包括游标): @Vinko Vrsalovic

正如我在问题中所写的,我知道如何在大多数DBs中做到这一点。我想知道怎样才能找到普遍的解决方案,或者得到它不存在的证据

下面是一个基于临时表的愚蠢解决方案。这显然很糟糕,所以没必要对此发表评论

N - upper bound
M - lower bound

create #temp (Id int identity, originalId int)

insert into #temp(originalId)
select top N KeyColumn from MyTable
where ...

select MyTable.* from MyTable
join #temp t on t.originalId = MyTable.KeyColumn
where Id between M and M
order by Id asc

drop #temp

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

许多数据库产品支持SQL,并对标准语言进行了专有扩展。其中一些支持分页,比如带有limit子句的MySQL,带有Oracle的Rowid;每个人的处理方式都不同。其他DBMS需要添加一个名为rowid的字段或类似的字段


我认为你不可能有一个通用的解决方案(任何人都可以自由地证明我错了,这是有争议的),除非它内置在数据库系统中,或者除非有一家公司使用Oracle,MySQL,SQL Server和他们决定让所有不同的数据库系统提供自己的分页实现,由数据库开发人员为使用它的代码提供通用接口

这种方法的问题在于,尽管IDENTITY是标准的SQL,但并非在所有数据库中都可用。另外,selecttop既不是标准的SQL,也不是广泛实现的。除此之外,与不使用临时表的方法相比,复制数据的操作可能要慢得多。也许可以应用视图而不是创建临时表?您可以创建一个视图,其中一列是标识列吗?但您甚至可以在这里使用依赖于引擎的SQL!Vinko Vrsalovic,我想我写得很清楚:“这显然很糟糕,所以没有必要对此发表评论。”是的,我尝试了不同的解决方案,但似乎不可能创建或多或少的便携版本。