如何在Pervasive SQL(版本9.1)中进行分页?我需要做类似的事情:
//MySQL
SELECT foo FROM table LIMIT 10, 10
但是我找不到定义偏移量的方法。
答案 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