首页 > 开发 > 综合 > 正文

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

2024-07-21 02:10:43
字体:
来源:转载
供稿:网友


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

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

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表