从Microsoft Sql Server 2005中返回有一定顺序的记录集

2016-02-19 15:18 0 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐从Microsoft Sql Server 2005中返回有一定顺序的记录集,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

  摘要:应用SqlServer2005开发也已经有一段时间了,但是很多时候都是把SqlServer2005当做SqlServer2000来用,因此很多SqlServer2005的新特性我都没有用到,有一个原因就是要兼容SqlServer2000的用户。新特性出来的当然就要用于实际当中,要想知道SQLServer2005的新特性可以参看微软网站的What's New in SQL Server 2005? ,特性有很多本篇文章主要介绍的是在数据库中返回特定顺序的记录集。

  数据库模型:

  在我们深入Sql排序语句时,我们先来看看数据库模型,也就是我们要建立一个数据库并通过这个数据库来进行我们的讲解。我们建立一个产品数据库,首先我们要建立一个产品表Products,包含ProductID(主键),Name,Price三个字段.这是一个很简单的数据库,下面我们就运用这个数据库来讲解以下排序。

  SQLServer2005提供我们四个排序函数:ROW_NUMBER, RANK, DENSE_RANK和NTILE,(据我了解)这四个函数在SqlServer2000中是没有的,在不同的场合我们可以选用这四个函数,他们各有各的特点,下面我们就逐个来看一下他们各个的特性。

  ROW_NUMBER():

  这个函数是通过对特定列来排序的,也就是说我们要指定按哪个列来排序。我们要知道他的特性当然首先我们要知道他的语法:

   ROW_NUMBER()OVER([partition]order-by-clause)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  先看例子,例如我们要从产品Products中的每一个产品按价格的高低排列出来,并得到每一个产品所在的序列号,代码如下:

SELECT[ProductID],[Name],[Price],
   
ROW_NUMBER()OVER(ORDERBY[Price]DESC)ASRank
FROMProducts

  则在返回的结果中将会出现Rank列,此列将从1开始逐行加1(1,2,3,…),这样我们就可以很灵活的应用这个功能来分页提取记录。下面我们来看看怎样来实现快速分页,假设我们每页显示的记录数位@PageSize,当前页面为@PageIndex,我们就可以用如下代码来进行分页:

  SELECTTOP(@PageSize)[ProductID],[Name],[Price]
 
FROM
 
(
SELECT[ProductID],[Name],[Price],ROW_NUMBER()OVER(ORDERBY[Price]DESC)ASRank
FROMProducts
 
)ASp
 
WHERERankBETWEEN((@PageIndex-1)*@PageSize+1)AND@PageSize*@PageIndex
  RANK(), DENSE_RANK():

   从上面的例子中我们知道了ROW_NUMBER()函数可以返回按一定列排列的行号。但是在两个相同记录中,例如我们的产品甲和乙的价格都为1RMB,在ROW_NUMBER()中将返回甲乙的顺序为#1,#2。但是有时候我们需要的是相同的记录返回相同的行号,如上面所说的将返回的行号为(甲) #1(乙)#1,这样我们就需要用到这里所要讲述的两个函数RANK()和DENSE_RANK()函数。用法和ROW_NUMBER的用法一样:

  SELECT[ProductID],[Name],[Price],

  RANK()OVER(ORDERBY[Price]DESC)ASRank

  FROMProducts

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  我们可以知道RANK()和DENSE_RANK()都能达到效果,而不同的是,RANK()将跳过相同的记录数的行号。也就是说虽然行号相同,但是下页个不同列值的行号将是这几个行号之和加上他们的行号。如上述的甲乙为#1,用RANK()者返回丙的结果为#3,而DENSE_RANK()返回丙的结果为#2。

  NTILE():

  当我们需要将给过分组排序时就要用到NTILE(),例如我们将所有的产品按照价格的高低从大到小分为5组,我们就可以用如下代码:

  SELECTProductID,Name,Price,NTILE(5)OVER(ORDERBYPriceDESC)asp

  FROMProduts

  这样将所有记录分成5份,按价格高低有1到5分开。

  总结:

  本文讲述的四个函数ROW_NUMBER, RANK, DENSE_RANK和NTILE都能够排序返回记录集,我想用的最多的就是应用ROW_NUMBER进行快速分页。其实他们四个各有各的特点,在我们平时的应用中灵活应用他们能够给我们带来很多的便利,很多的快乐!同时也希望这篇文章能够给大家带来点帮助,带来一点快乐!

来源:https://www.tulaoshi.com/n/20160219/1609364.html

延伸阅读
标签: Web开发
为什么在存储过程中用OLEDB方式不能返回记录集? 我曾写过一段程序,是对临时表操作的(主要功能是取出每种分类的TOP10条记录)。 该存储过程使用ODBC连接数据库时正常,能够得到正确的结果。但在使用oledb方式连接时,却不能返回记录集,而一旦操作返回记录集时就出现错误提示: ADODB.Recordset 错误 '800a0e78' The operation requested by ...
标签: Web开发
首先要明确一个基本原则,XML类型的数据之间以及XML类型与其它数据类型之间都是不能比较的,也就是说XML类型的数据不能出现在等号的任何一边。 大致可分为查询类,修改类和跨域查询类。 查询类包含query(),value(),exist()和nodes(). 修改类包含modify(). 跨域查询类包含sql:variable()和sql:column(). 查询类 ...
unit UDataModule; interface uses    Controls,SysUtils, Classes, DB, ADODB,windows,forms,CustomCom_TLB; type   TDataModule1 = class(TDataModule)     ADOConnection1: TADOConnection;     dsDataSet: TADODataSet;     A...
数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。 use Northwind begin tran insert into Orders(CustomerId) values(@#ALFKI@#) waitfor delay @#00:00:...
tempdb数据库是SQL Server用于临时或者开关操作的数据库。对tempdb所做的很多优化都是在透明的情况下,让处理加速,本文就介绍tempdb对SQL Server 2005的影响以帮助大家利用这些来写出更好的、更先进的SQL Server 2005代码。 SQL Server 2005版本中的所有变化可以写成一本书,事实上,已经被写成了好几本书。其中,最重要的变化不是功...

经验教程

979

收藏

91
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部