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

记录集

问:我的一个表中包含了名为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

程序清单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)

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

时间: 2024-08-18 07:32:14

一种基于记录集查找特定行的方法的相关文章

php实现在多维数组中查找特定value的方法_php技巧

本文实例讲述了php实现在多维数组中查找特定value的方法.分享给大家供大家参考.具体如下: 最近做项目,需要从多维数组中查找是否含有特定的key和其对应特定的value,并清除该条数据,比如: $arr = array( //为了看的方便,数组表达形式不对 0=>array(id =>1,name =>"li") 1=>array(id =>2,name =>"na") 2=>array(id =>3,name =

一种基于粒子群优化的虚拟资源分配方法

一种基于粒子群优化的虚拟资源分配方法 周相兵 针对云计算环境下存在虚拟化资源利用率不高.延迟.性能衰减等问题,提出一种基于粒子群的虚拟资源分配优化方法.根据云计算优势,对虚拟化资源进行描述及状态定义,分析了虚拟环境下的服务质量(quality of services,QoS)组成和计算方法;同时通过用户与云提供商收益最大化的平衡关系,建立一种虚拟化操作方法,以确保虚拟化资源被合理分配和回收;采用粒子群算法使用户和虚拟服务提供方都能趋于收益平衡.在此基础上设计的一款云播放器与直接嵌入到Web播放器

几种打开记录集方式的比较

比较|记录集|记录集 先定义conn.asp<% dim objConn dim strConn strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & chr(34) & Server.MapPath("data.mdb") & chr(34)  set objConn = server.createobject("adodb.connection")

ASP中几种打开记录集方式的比较

比较|记录集 先定义conn.asp<% dim objConn dim strConn strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & chr(34) & Server.MapPath("data.mdb") & chr(34)  set objConn = server.createobject("adodb.connection") obj

轨迹系列——一种基于中值滤波的轨迹纠偏方法和几点思考

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在无路网的情况下,如何进行轨迹纠偏也是一个很多人在研究的内容,各种方案均有很多,有基于不同滤波算法的,也有基于机器学习的,等等.这里,我探讨一种实现相对简单的基于中值滤波来进行轨迹纠偏的方法. 2.中值滤波简介 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代

记录集

记录集     前面已经提到,记录集是ADO中最常用的对象,这并不值得奇怪.毕竟,他们包含着数据.但是,对于记录集还有比想象的更多的内容,知道数据如何保存和处理很重要,因为这为选择使用哪种记录集提供了更多的参考.    记录集有不同的类型,在一些细小的地方存在着差异,很容易造成失误.首先需要认真谈论的是光标的概念. 8.4.1 光标    光标(cursor)是让许多人感到困惑的概念,但实际上非常的简单.    光标用来管理记录集和记录集的当前位置,后者是由当前记录指针来处理的.    这不是R

利用XSLT把ADO记录集转换成XML

ado|xml|记录集|转换 由于XML(可扩展标记语言:eXtensible Markup Language)真正的平台无关性,它正在逐渐成为数据传输的主要介质.XML是一种自描述的语言,数据本身就已经包含了元数据,即关于数据本身的信息.例如:"孟子E章1757281793923net_lover1807581793923"这组数据,从字面很难看出它代表什么意思,也不清楚它有几个数据段组成,但是,如果用XML来做如下的描述,我们就可以清楚地看到每个数据段所代表的含义:  <Pe

asp中记录集对象的getrows和getstring用法分析_应用技巧

GetRows 方法 将 Recordset 对象的多个记录复制到数组中. 语法 复制代码 代码如下: array = recordset.GetRows( Rows, Start, Fields ) 返回值 返回二维数组. 参数 Rows 可选,长整型表达式,指定要检索记录数.默认值为 adGetRowsRest (-1). Start 可选,字符串或长整型,计算得到在 GetRows 操作开始处的记录的书签.也可使用下列 BookmarkEnum 值. 常量 说明 AdBookmarkCur

asp中记录集对象的getrows和getstring用法分析

GetRows 方法 将 Recordset 对象的多个记录复制到数组中. 语法 复制代码 代码如下: array = recordset.GetRows( Rows, Start, Fields ) 返回值 返回二维数组. 参数 Rows 可选,长整型表达式,指定要检索记录数.默认值为 adGetRowsRest (-1). Start 可选,字符串或长整型,计算得到在 GetRows 操作开始处的记录的书签.也可使用下列 BookmarkEnum 值. 常量 说明 AdBookmarkCur