用一句SQL取出第 m 条到第 n 条记录的方法

系统 1682 0
从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)
   
    SELECT   TOP  n - m + 1   *  
    FROM   Table  
    WHERE  (id  NOT   IN  ( SELECT   TOP  m - 1  id  FROM   Table  ))  
   
   
    -- 从TABLE表中取出第m到n条记录 (Exists版本)
   
  SELECT   TOP  n - m + 1   *   FROM   TABLE   AS  a  WHERE   Not   Exists
  ( Select   *   From  ( Select   Top  m - 1   *   From   TABLE   order   by  id) b  Where  b.id = a.id ) 
  Order   by  id
 
 
  -- m为上标,n为下标,例如取出第8到12条记录,m=8,n=12,Table为表名
 
  Select   Top  n - m + 1   *   From   Table  
  Where  Id > ( Select   Max (Id)  From  
  ( Select   Top  m - 1  Id  From   Table   Order   By  Id  Asc Temp
  Order   By  Id  Asc   
 
=====================================================================================================
在sql server 2005中提供了函数ROW_NUMBER() ,可以更方便的来实现
--按BirthDate排序,取第10条到20条的数据
SELECT BirthDate FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY BirthDate) AS a,BirthDate
FROM HumanResources.Employee
) AS a
WHERE a BETWEEN 10 AND 20

ROW_NUMBER () 函数是Sql 2005中新添的一个函数。通常它被用在分页的SQL语句中。

微软官方的对此函数的描述是:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

我对此的理解:利用此函数可以为表中的某个字段建立序列,从1开始。就是说,根据已存在的某列,利用此函数可建立一新列,新列是数字,按照已存在列的顺序从1开始。

   上边可能说的不是很清楚,请结合下边这个例子来看吧!

 


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  1 USE  Northwind
 2 GO
 3
 4 --
 5 SELECT  OrderID, 
 6     CustomerID, 
 7     OrderDate
 8 FROM  dbo.Orders  WITH (NOLOCK)
 9
10 SELECT  OrderID, 
11     CustomerID, 
12     OrderDate, 
13     ROW_NUMBER()  OVER ( ORDER   BY  orderID  DESC AS  字段编号
14 FROM  dbo.Orders  WITH (NOLOCK)

第一个查询只是一个普通的查询,查询出Orders表中的3个字段的记录。其结果为:

用一句SQL取出第 m 条到第 n 条记录的方法

 

第二个查询相比第一个查询仅仅是多了“  ROW_NUMBER ()   OVER ( ORDER   BY  orderID  DESC )   AS   字段编号   这段语句。我们来分析一下这段语句。

这段语句的作用就是利用 ROW_NUMBER () 函数根据OrderID这列来生成一个新的数据列,这列的名称为字段编号。然后我们根据 ORDER   BY  orderID  DESC 来指定字段编号这列按照OrderID的逆序来生成,结果如下:

用一句SQL取出第 m 条到第 n 条记录的方法

 

比较两个结果集,会发现第二个结果集是按照 OrderID 字段逆序的记录,其实也可看成是字段编号这个字段的正序排序, ROW_NUMBER () 函数相当于为SELECT语句末尾加了ORDER BY子句,第二个SELECT语句其实等价于:

 


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 SELECT  OrderID, 
2     CustomerID, 
3     OrderDate, 
4     ROW_NUMBER()  OVER ( ORDER   BY  OrderID  DESC AS  字段编号
5 FROM  dbo.Orders  WITH (NOLOCK)
6 ORDER   BY  字段编号ASC

 

下边来看一个对 ROW_NUMBER () 函数的简单分页应用。

 


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  1 -- Partition Page Demo
 2 /**/ /*  取出第- 200条的记录(记录须按OrderID排序) */
 3
 4 WITH  OrdersByOrderIDASC  AS  
 5 (
 6      SELECT  OrderID, 
 7         CustomerID, 
 8         OrderDate, 
 9         ROW_NUMBER()  OVER ( ORDER   BY  orderID  ASC AS  字段编号
10      FROM  dbo.Orders  WITH (NOLOCK)
11 )
12
13 SELECT   *  
14 FROM  OrdersByOrderIDASC  WITH (NOLOCK)
15 WHERE  字段编号BETWEEN  100   AND   110

 

首先把应用 ROW_NUMBER () 函数后的结果集存在一张临时表中,然后以字段编号这个字段为条件,使用BETWEEN关键字过滤相应的记录。

用一句SQL取出第 m 条到第 n 条记录的方法


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论