一种基于记录集查找特定行的方法

2016-01-29 16:19 5 1 收藏

一种基于记录集查找特定行的方法,一种基于记录集查找特定行的方法

【 tulaoshi.com - SQLServer 】

 

问:我的一个表中包含了名为IdValue的单列主键。对于给定的IdValue值,我希望找到紧邻目标值之前和之后的表行(假定结果按IdValue排序)。怎样才能不使用游标而通过一个基于集合的方法得到需要的结果?

答:Transact-SQL是一个基于集合的语言,使用它在结果集中定位特定的行并非一件易事。但是,服务器端ANSI Transact-SQL游标的性能远远不如基于集合的解决方案,因此,学习解决问题的多种技术非常重要,尤其在面临上述问题时。

以Northwind数据库中的Orders表为例。我们可以这样重述该问题:怎样才能在Orders表中找到紧邻特定行之前和之后的行而不使用游标?假设我们按照OrderId列对结果集排序。

创造性地使用SQL Server的MIN()、MAX()和 TOP功能可以帮助您解决诸如此类的结果集定位问题。程序清单1和2给出了两个相似的、仅有细微差别的解决方法。程序清单1提供了一个常见的解决方案,因为它运用了@TargetOrder的MIN()和MAX()终点。但在某些情况下,展示TOP的灵活性也很有用。请注意,在以参数方式提供Orders表的最小OrderId(10248)时,程序清单2中的查询将返回空集,因为该查询假定在@TargetOrder行前总有一个行存在。

一般说来,生成结果集的方法不止一种,其中某一方法通常比其他的更高效。当您对这两个例子评估SHOWPLAN和SET STATISTICS IO信息时,您会发现运用了TOP语句的程序清单2的效率略微高于程序清单1。差别很细微的原因在于样本数据集很小,但在存在多种查询方法的情况下,测试不同方法的性能非常重要。

—Brian Moran

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

程序清单1:使用包含OR关键字的MIN() and MAX()函数查找目标行

DECLARE @TargetOrder int

SET @TargetOrder=10330

FROM Orders

WHERE OrderId=@TargetOrder

OR OrderId=(SELECT MAX(OrderId)

FROM orders WHERE OrderId < @TargetOrder)

OR OrderId = (SELECT MIN(OrderId)

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

FROM orders WHERE OrderId @TargetOrder)

程序清单2:使用TOP关键字查找目标行

SELECT

TOP 3

*

FROM orders

WHERE OrderId =(SELECT MAX(OrderId) FROM orders

WHERE OrderId < @TargetOrder)

ORDER BY

OrderId

 

 

来源:http://www.tulaoshi.com/n/20160129/1498286.html

延伸阅读
  通常状况下,大家都使采用判断来判断textarea控件中含有多少行,但是,有这么一种情况,就是没有使用回车,而是字符过宽而textarea自动换的行,很显然,上面那种方法就不可行了.   这里,封装了一个方法getTextRange(num, areaId),这个方法只需要传入textarea的id及其需要的行号,即可以返回指定行,为了灵活,这里没有返回指定行的文本,...
摘要:应用SqlServer2005开发也已经有一段时间了,但是很多时候都是把SqlServer2005当做SqlServer2000来用,因此很多SqlServer2005的新特性我都没有用到,有一个原因就是要兼容SqlServer2000的用户。新特性出来的当然就要用于实际当中,要想知道SQLServer2005的新特性可以参看微软网站的What's New in SQL Server 2005? ,特性有很多...
标签: Web开发
为什么在存储过程中用OLEDB方式不能返回记录集? 我曾写过一段程序,是对临时表操作的(主要功能是取出每种分类的TOP10条记录)。 该存储过程使用ODBC连接数据库时正常,能够得到正确的结果。但在使用oledb方式连接时,却不能返回记录集,而一旦操作返回记录集时就出现错误提示: ADODB.Recordset 错误 '800a0e78' The operation requested by ...
标签: Web开发
上网找了一些资源,才弄明白这是编码的问题,我的服务器端发送过来的数据是GB2312编码的,而AJAX把接收到的数据都当成UTF-8编码的。 网上的很多解决方法都是服务器端基于PHP、JSP等的,要改变这些的编码方式都比较简单。但是我的服务器端是用了C编写的CGI程序,用于嵌入式系统中的,所有的输出都是用了printf。 最后找到一个在linux下的头文...
tuLaoShi.com安全期避孕你真的了解吗 自然避孕法包括安全期避孕法和哺乳闭经避孕法。自然避孕法不干扰身体的生理功能,也无副作用,不宜采用其他避孕方法的妇女或处于特殊生理阶段的妇女多乐意选用。由于对哺乳期妇女的恢复排卵很难测定,故哺乳闭经避孕法基本上已不使用,产后不管是否来月经,都应采取避孕措施。 自从1827年在哺乳动物体内...

经验教程

953

收藏

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