或许有人发过类似的帖子,不过对我来说是第一次。
   很多分页都都是使用top,not in, not exists,临时表,表变量   我刚想到的另一种方法如下:
use northwind;select a.* from
(select top 60 * from products )a
left join 
(select top 50 * from products) b
on b.productid = a.productid
where b.productid is null这将会得到productid为51-60的纪录
暂且不讨论此语句的性能
不知道大家对此有什么看法?

解决方案 »

  1.   

    这将会得到productid为51-60的纪录得到这个结果的记录的前提是你的数据库里面的productid得从1排到60
    如果1到60的记录都删除了 得到的也许就是110到120的,如果中间再有删除的....
      

  2.   

    另外,虽然你说了不考虑性能,不过,在数据量特别大的情况下,有几个不考虑性能的?
    再说了,你这语法在sql server里也许没问题,不过不适合oracle啊
      

  3.   

    其实跟Web里面的DataGrid分页差不多的,更确切的说要比Web里面更简单一些,这就要看你对分页的原理了不了解了。可以用微软提供的DataGrid控件来解决分页问题,不需要使用第三方控件。
    楼主可以先到我的小论坛去熟悉一下分页的基本概念。(显示帖子页面,查看回复页面)
    www.xproer.com/bbs
    然后我再跟你讲解一下目前最简单的一种分页方法。通常我们为了考虑分页SQL语句的性能,最好使用四个按钮来实现分页。
    首页,上一页,下一页,尾页
    这四个按钮事件内部分页用四条SQL语句来实现从数据库中读取相应的数据。通常我们的数据表中有ID列,这个基本上是用来分页的。如果我们的数据显示形式是从最新的到最旧的显示方式:
    ID显示:
    100
    99
    98
    97
    96
    95
    94
    93
    92
    91
    90
    89
    88
    87
    86
    85
    84
    83毫无疑问,首页是前10条(假设一页显示10条数据)是从100开始到91,这个SQL最简单:select top 10 from Table1 order by ID DESC        (这个这是首页的SQL语句)那么下一页就是ID要比91小的前10条数据,select top 10 from Table1 where ID<@ID order by ID DESC   (这是下一页SQL语句)尾页SQL语句也是超简单select top 10 from Table1 order by ID ASC          (这个是尾页)上一页SQL语句select top 10 from Table1 where ID>@ID order by ID DESC  (上一页SQL语句)好了,基本分页SQL语句搞定了,那么重要的就是如何取到这些ID值,我们可以将数据读取前台,通过JS获取这些相应的ID值,然后传给服务端控件,这样我们就可以轻松的实现分页了。 
      
    基本上这算得上是最简单的分页了同时也是效率最高的,因为还有一些SQL语句,比如
    select top @PageSize * from (select top @DataCount * from AdminTB order by ID ASC)a order by ID DESC;");原理:
    假设有30条数据:
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30现在我们要取中间的10条数据,则SQL语句要这样写
    select top 10 * from (select top 20 * from AdminTB order by ID ASC) order by ID DESC;");
    实际上的效果如下
    (1,2,3,4,5,6,7,8,9,[ 10,11,12,13,14,15,16,17,18,19,20 ]),21,22,23,24,25,26,27,28,29,30select top 20 * from AdminTB order by ID ASC是取得 () 部分数据
    select top 10 * from (select top 20 * from AdminTB order by ID ASC) order by DESC;取得是 [] 部分。这下明白了吧不过遗憾的是这种分页是效率最低的,因为 @DataCount 会随着你的数据增加而增大,所以我们提倡用第一种,也就是我上面讲的。
      

  4.   

    select   top   20   *   from   AdminTB   order   by   ID   ASC是取得   ()   部分数据 
    select   top   10   *   from   (select   top   20   *   from   AdminTB   order   by   ID   ASC)   order   by   DESC;
    是不正确的,有两个问题,1,最后一页需要判断,2 ,最后一页数据和上一页有重复