前面讲的几种分页方法,综合效率与适用性来讲,B1 是最好的。但能不能对 B1 继续改进呢,可以的。
假设有一个新闻表,按 id 的逆序分页排列。
select *
from (select top 页大小 *
from (select top 当前页*页大小 * from news order by id desc) a
order by a.id) b
order by b.id desc
- 先逆序取得当前页及之前的所有记录。
- 再正序取出当前页的记录。
- 将当前页的记录逆序排列得最终的排列结果。
这种 SQL 语句可能不适合于 Access,上述“当前页*页大小”应该是计算好才能进入 SQL,而不是在 SQL 中计算乘积。
其实上述 SQL 还是需要改进的,想想页大小为 2,总记录数为 3,根据上述 SQL 语句,在第二页时也显示两条记录,原因是第二个 select 选取的是页大小,应该先取出总记录数,再计算出当前页的大小(实际上除了最后一页,其它各页都是一样的)。语句改为:
select *
from (select top 当前页大小 *
from (select top 当前页*页大小 * from news order by id desc) a
order by a.id) b
order by b.id desc