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

//MySQL
SELECT foo FROM table LIMIT 10, 10

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

有帮助吗?

解决方案 4

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

我认为我编写了一个简单的方法来进行分页,但似乎普遍的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

其他提示

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,......)

我们的分页要求我们能够将当前页码和页面大小(以及一些额外的过滤器参数)作为变量传递。由于选择的顶部@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)
内连接度WITH   (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

     

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

我在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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top