2008-09-23 57 views
0

如何做到普适SQL分页(9.1版本)?我需要做类似的事情:寻呼普适SQL

//MySQL 
SELECT foo FROM table LIMIT 10, 10 

但我找不到一种方法来定义偏移量。

回答

0

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

我以为我做了一个简单的方法来做分页,但似乎pervasive sql不允许子查询中的order子句。但是,这应该对其他DB的工作(我测试了火鸟)在PSQL

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

我面对MS SQL这个问题太...没有限制或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 
1

我们的寻呼要求我们能够在当前页码和页面大小通(沿与一些额外的过滤器参数)作为变量。由于选择顶部@page_size不会在MS SQL工作,我们提出了建立一个临时或变量表分配各行的主键以后可以过滤对所需页面数量和规模的身份。

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

向下的一面这是它仍然需要所有的结果插入到临时表,但至少它是唯一的钥匙。这适用于MS SQL,但应该能够以最小的调整工作于任何数据库。

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

--create临时表与标识列和ID
--oF的记录中你会选择。这是一个在内存
--table,因此,如果您将插入的行数大于
--than 10,000,那么你应该在tempdb
--instead使用临时表。要做到这一点,使用
- 创建表#temp_table(INT ROW_NUM IDENTITY(1,1),OBJECTID INT)
--and改变所有的引用@temp_table到#temp_table
DECLARE @temp_table表(INT ROW_NUM IDENTITY(1,1),objectid int)

- 用记录的ID插入临时表
- 我们想返回。这是至关重要的
以确保秩序--reflects的记录的顺序返回,以便ROW_NUM
--values以正确的顺序设置,我们正在基于页面选择
--correct记录
INSERT INTO @temp_table (OBJECTID)

/*实施例:选择插入了 记录到临时表
SELECT PERSONID
FROM人WITH (NOLOCK)
内加入WITH (NOLOCK)上的程度的程度。 personid = person.personid
WHERE = person.lastname @last_name
ORDER BY person.lastname ASC, person.firsname ASC
*/

--get行的总数目,我们匹配
DECLARE @total_rows INT
SET @total_rows = @@ ROWCOUNT
- 计算的基础上,
--rows匹配的数量,并通过在作为一个参数的页面尺寸的页面总数
DECLARE @total_pages诠释
--add的@ page_size - 1到总行数到
- 计算总页数。这是因为SQL
--alwasy几轮下来的整数的除法
SET @total_pages = (@total_rows + @page_size - 1)/ @page_size

--return结果集,我们通过加入兴趣
- 返回到@temp_table并按row_num过滤
/*示例: 选择要返回的数据。如果 插入做
正确,那么 你应该总是能够加入包含
行返回 到ObjectID列在 @temp_table

SELECT人表 。* FROM
人以 ( NOLOCK)的INNER JOIN @temp_table TT
ON PERSON.PERSONID = tt.objectid
*/
--return只有我们是通过的该ROW_NUM列感兴趣
--and顺序页的行@temp_table确保
- 我们正在选择正确的记录
WHERE tt.row_num < (@page_size * @page_number)+ 1
和tt.row_num>(@page_size * @page_number) - @page_size
ORDER BY tt.row_num

2

测试查询:

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

对于所有n =节数u需要在同一时间获取记录。 并且k = n的倍数(例如,n = 5; k = 0,5,10,15,...)