在Pervasive SQL中进行分页

时间:2008-09-23 19:04:07

标签: sql pervasive

如何在Pervasive SQL(版本9.1)中进行分页?我需要做类似的事情:

//MySQL
SELECT foo FROM table LIMIT 10, 10

但是我找不到定义偏移量的方法。

4 个答案:

答案 0 :(得分:2)

PSQL中的测试查询:

select top n * 
from tablename 
where id not in(
select top k id
from tablename 
) 

对于你需要一次获取的所有n = no.of记录。 和k = n的倍数(例如,n = 5; k = 0,5,10,15,......)

答案 1 :(得分:1)

我们的分页要求我们能够将当前页码和页面大小(以及一些额外的过滤器参数)作为变量传递。由于选择的顶部@page_size在MS SQL中不起作用,我们想出了创建一个临时表或变量表,为每个行主键分配一个标识,以后可以过滤该标识以获得所需的页码和大小。

**请注意,如果您有GUID主键或复合键,则只需将临时表上的对象ID更改为uniqueidentifier,或将其他键列添加到表中。

这方面的缺点是它仍然必须将所有结果插入到临时表中,但至少它只是键。这适用于MS SQL,但应该能够适用于任何具有最小调整的数据库。

  

声明@page_number int,@ page_size   int - 添加任何其他搜索   参数在这里

     

- 使用标识列和id来创建临时表    - 您将选择的记录。这是记忆中的一种   --table,所以如果你要插入的行数更多的话    - 至少10,000,那么你应该在tempdb中使用临时表
   - 代替。为此,请使用
  --CREATE TABLE #temp_table(row_num int IDENTITY(1,1),objectid int)
   - 并将对@temp_table的所有引用更改为#temp_table
  DECLARE @temp_table TABLE(row_num int   IDENTITY(1,1),objectid int)

     

- 使用记录的ids插入临时表中    - 我们想回来。按顺序确定订单至关重要    - 反映要返回的记录的顺序,以便row_num
   - 值按正确顺序设置,我们选择
   - 基于页面的正确记录
INSERT INTO @temp_table   (OBJECTID)

     

/ *示例:选择插入   记录到临时表中   SELECT personid
FROM person WITH   (NOLOCK)
内连接度   (NOLOCK)在degree.personid =   person.personid
在哪里   person.lastname = @last_name
  ORDER BY person.lastname asc,   person.firsname asc
  * /

     

- 获取我们匹配的总行数(DECLARE @total_rows)   int
SET @total_rows =   @@ ROWCOUNT
   - 根据数量计算总页数    - 匹配的页面和作为参数传递的页面大小
DECLARE   @total_pages int
   - 将@page_size - 1添加到总行数为
   - 计算总页数。这是因为sql
  --alwasy向下舍入为整数划分
SET @total_pages =   (@total_rows + @page_size - 1)/   @page_size

     

- 通过加入
返回我们感兴趣的结果集    - 回到@temp_table并按row_num过滤
/ *示例:   选择要返回的数据。如果   插入完成后,然后   你应该永远加入这个桌子   包含要返回的行   到了objectid专栏   @temp_table

     

选择人。*
来自人   (NOLOCK)INNER JOIN @temp_table   tt
ON person.personid =   tt.objectid
  * /
   - 仅返回我们感兴趣的页面中的行    - 并通过@temp_table的row_num列进行排序以确保
   - 我们正在选择正确的记录
WHERE tt.row_num<   (@page_size * @page_number)+ 1
  AND tt.row_num> (@页面大小 *   @page_number) - @page_size
ORDER   BY tt.row_num

答案 2 :(得分:0)

我在MS Sql中也面临这个问题......没有Limit或rownumber函数。我所做的是将我的最终查询结果(或有时是整个字段列表)的键插入带有标识列的临时表中...然后我从临时表中删除我想要的范围之外的所有内容...然后使用对键和原始表的连接,以带回我想要的项目。如果你有一个很好的独特键,这是有效的 - 如果你没有,那么......这本身就是一个设计问题。

性能稍好的替代方法是跳过删除步骤,只使用最终连接中的行号。另一个性能改进是使用TOP运算符,这样至少,你不必抓住你想要的东西。

所以......用伪代码......抓住80-89项......

create table #keys (rownum int identity(1,1), key varchar(10))

insert #keys (key)
select TOP 89 key from myTable ORDER BY whatever

delete #keys where rownumber < 80

select <columns> from #keys join myTable on #keys.key = myTable.key

答案 3 :(得分:0)

我最终在代码中进行了分页。我只是跳过循环中的第一个记录。

我认为我编写了一个简单的方法来进行分页,但似乎普遍的sql不允许子查询中的order子句。但这应该适用于其他数据库(我在firebird上测试过)

select *
from (select top [rows] * from
(select top [rows * pagenumber] * from mytable order by id)
order by id desc)
order by id