请问如何读取数据库中的部分数据
比如每页显示20条记录
那如何获取第2页的21条记录到第40条记录

解决方案 »

  1.   

    --前提是必需有一列是自动增长类型,唯一性--方法一SELECT DISTINCT TOP 8 CategoryID
    FROM tbl_Product_Products
    WHERE (UserID = 73) AND (CategoryID >
              (SELECT MAX(categoryid)
             FROM (SELECT DISTINCT TOP 16 categoryid
                     FROM tbl_product_products where userid=73
                     ORDER BY categoryid) AS b))
    ORDER BY CategoryID--方法二select top 10 * from [order details]
    where orderid>all(select top 10 orderid from [order details] order by orderid)
    order by orderid
      

  2.   

    1.分页方案一:(利用Not In和SELECT TOP分页)  语句形式:SELECTTOP10*
    FROMTestTable
    WHERE(IDNOTIN
         (SELECTTOP20id
        FROMTestTable
        ORDERBYid))
    ORDERBYID
    SELECTTOP页大小*
    FROMTestTable
    WHERE(IDNOTIN
         (SELECTTOP页大小*页数id
        FROM表
        ORDERBYid))
    ORDERBYID
      2.分页方案二:(利用ID大于多少和SELECT TOP分页)  语句形式:  SELECTTOP10*
    FROMTestTable
    WHERE(ID>
         (SELECTMAX(id)
        FROM(SELECTTOP20id
            FROMTestTable
            ORDERBYid)AST))
    ORDERBYID
    SELECTTOP页大小*
    FROMTestTable
    WHERE(ID>
         (SELECTMAX(id)
        FROM(SELECTTOP页大小*页数id
            FROM表
            ORDERBYid)AST))
    ORDERBYID
      3.分页方案三:(利用SQL的游标存储过程分页)create procedureSqlPager
    @sqlstrnvarchar(4000),--查询字符串
    @currentpageint,--第N页
    @pagesizeint--每页行数
    as
    setnocounton
    declare@P1int,--P1是游标的id
    @rowcountint
    execsp_cursoropen@P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcountoutput
    selectceiling(1.0*@rowcount/@pagesize)as总页数--,@rowcountas总行数,@currentpageas当前页
    set@currentpage=(@currentpage-1)*@pagesize+1
    execsp_cursorfetch@P1,16,@currentpage,@pagesize
    execsp_cursorclose@P1
    setnocountoff
      其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。  建议优化的时候,加上主键和索引,查询效率会提高。  通过SQL 查询分析器,显示比较:我的结论是:  分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句  分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句  分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
      

  3.   

    http://www.cnblogs.com/cherish58/archive/2007/05/08/739465.html
      

  4.   

    从来没用过分页控件,自己写一个SQL,用TOP语句,可能效率不高,但是简单int pageIndex = 2;//当前页号
    int pageSize = 20; //每页显示记录数
    string sql;  //SQL语句int recordBefore = (pageIndex - 1) * pageSize;if (recordBefore == 0)
      sql = "select top " + pageSize + " 字段 from [table] order by 排序字段 DESC";
    else
      sql = "select top " + pageSize + " 字段 from [table] where 字段 not in (select top " + recordBefore + " 某一字段(如ID) from [table] order by 排序字段 DESC) order by 排序字段 DESC"大概就是这样
      

  5.   

    SELECT TOP PAGESIZE NEWSTITLE  
    FORM NEWSINFO WHERE NEWSID NOT IN  
    (SELECT TOP (PAGE-1)* PAGESIZE NEWSID FROM NEWSINFO  
    WHERE Auditing=1 and NEWSBREED='企业新闻' order by NEWSID DESC)  
    AND Auditing=1 and NEWSBREED='企业新闻' order by NEWSID DESC 
      
    其中:PAGE表示当前页数,PAGESIZE表示页的大小;这里利用了NOT IN,不复合SARG,但总比一次读取全部的记录要好的多。