技术资料首页 >> 数据库专栏 >> Sybase专栏 >> 版本12.5.2,分页取数据的sql怎么写?谁能帮我

版本12.5.2,分页取数据的sql怎么写?谁能帮我 (1)

2006-09-14 13:37:22作者: 来源:http://www.chinaunix.net/jh/21/667988.html 浏览次数:0 文字大小:【】【】【

版本12.5.2,分页取数据的sql怎么写?



 leno_mx 回复于:2005-12-13 16:14:59

不明白什么意思?


 iim_liyongfeng 回复于:2005-12-13 16:23:08

取第11条到第20条的记录:
象mysql一样,select * from table where c1='a' start 11 limit 10


 flybean 回复于:2005-12-13 17:29:48

set rowcount 20
-- get 20 rows
-- discard the first 10 rows
set rowcount 0


 ncowboy 回复于:2005-12-13 18:18:34

引用:原帖由 flybean 于 2005-12-13 17:29 发表
set rowcount 20
-- get 20 rows
-- discard the first 10 rows
set rowcount 0 



不能够设置起始位置啊。哥哥。


 ncowboy 回复于:2005-12-13 18:20:57

可是,这个不能够用。
引用:显式限制查询返回的行数

--------------------------------------------------------------------------------

您可以使用 FIRST 或 TOP 关键字限制查询的结果集中包括的行数。这些关键字用于包括 ORDER BY 子句的查询。

示例 
以下查询返回在按姓氏对雇员进行排序时首先出现的雇员的信息:

SELECT FIRST *
FROM employee
ORDER BY emp_lname
以下查询返回按姓氏排序时出现的前五个雇员:

SELECT TOP 5 *
FROM employee
ORDER BY emp_lname
在使用 TOP 时,您也可以使用 START AT 来提供偏移。以下语句列出按姓氏以降序进行排序时出现的第五个和第六个雇员:

SELECT TOP 2 START AT 5 *
FROM employee
ORDER BY emp_lname DESC
FIRST 和 TOP 只能与 ORDER BY 子句联合使用,以确保获得一致的结果。如果使用 FIRST 或 TOP 时没有 ORDER BY,则会触发语法警告,并且很可能产生无法预知的结果。

注意 
'start at' 值必须大于 0。当 'top' 为常量时,其值必须大于 0;当 'top' 为变量时,其值必须大于或等于 0。 




 zhhui2000 回复于:2005-12-13 18:38:27

SYBASE 不提供这种方式的提取,除非自己写一个游标


 iim_liyongfeng 回复于:2005-12-13 19:33:57

top 语句不行啊

1> select top 10 * from tblStudentCode order by Code
2> go
Msg 102, Level 15, State 1:
Server 'DBSVR', Line 1:
Incorrect syntax near '10'.


 jarjar 回复于:2005-12-13 21:47:48

top语句在12.5.3之后才支持,实际上使用set rowcount n是个不错的选择


 leno_mx 回复于:2005-12-14 10:18:05

top在ASE 15可以支持,但不知道start at支不支持?


 hannibal 回复于:2005-12-14 16:51:24

一段很好的分页程序,速度很快,sybase内部员工写的,改成自己需要的SQL吧。

create procedure test_p @ipage int, @num int as   /* @ipage  页码, @num 每页的记录数 */
begin
declare @maxpages int, @rcount int   /* @maxpages 最大页码 */
if @ipage>=100
select @maxpages=ceiling(count(*)/@num) from test
else
         select @maxpages=100000
if @ipage<=@maxpages/2 
begin
select @rcount=@ipage*@num
set rowcount @rcount
select id=identity(12),name,descs,ddd into #temptable1 from test order by id
select * from #temptable1  where id>=(@ipage-1)*@num and id<= @ipage*@num
end else
begin
select @rcount=(@maxpages-@ipage+1)*@num
set rowcount @rcount
select id=identity(12),name,descs,ddd into #temptable2 from test order by id desc 
select id,name, ddd,descs from #temptable2  where id>=(@maxpages-@ipage)*@num and id<= (@maxpages-@ipage+1)*@num  order by id  desc
end
end


 hannibal 回复于:2005-12-14 17:38:29

好事做到底,送个通用版吧

create procedure splitpage @qry varchar(16384),@ipage int, @num int as   /*@qry SQL语句, @ipage 页数, @num 每页记录条数 */
begin
        declare @maxpages int
        declare @rcount int
        declare @execsql varchar(16384)

        if @ipage>=100
                select @maxpages=ceiling(count(*)/@num) from test
        else
                select @maxpages=100000
        if @ipage<=@maxpages/2
        begin
                select @rcount=@ipage*@num
                set rowcount @rcount
                set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
                set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')
                set @execsql = @execsql || ' select * from #temptable1  where sybid>' || convert(varchar,(@ipage-1)*@num) || ' and sybid <= ' || convert(varchar,@ipage*@num)
                execute (@execsql)

        end else
        begin
                select @rcount=(@maxpages-@ipage+1)*@num
                set rowcount @rcount
                set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
                set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')
                set @execsql = @execsql || ' order by sybid desc'
                set @execsql = @execsql || ' select * from #temptable1 where sybid > ' || convert(varchar,(@maxpages-@ipage)*@num) || ' and sybid <= ' || convert(varchar,(@maxpages-@ipage+1)*@num)
                execute (@execsql)
        end
end


 vct00 回复于:2005-12-15 08:28:54

>select id=identity(12),name,descs,ddd into #temptable1&nb
[1] [2]

相关文章