收藏本站 
广告服务 
网站地图 
>> 我们从网络和杂志上收集了近100000余篇各类电脑技术、网络技术、软件技术等方面的文章教程,我们的收录原则:不是精华拒不收录!
先飞电脑技术网技术文章
网络编程 | 网站建设 | 网络技术 | 设计教程 | 软件教学 | 程序开发 | 数据库开发 | 教育认证 | 硬件维护 | 媒体动画 | 机械电子 |
一种基于记录集查找特定行的方法
[ 作者:佚名    转贴自:网络转载    阅读次数:88    更新时间:2007-8-15 11:07:00   录入:刘光勇 ]         
    问:我的一个表中包含了名为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。差别很细微的原因在于样本数据集很小,但在存在多种查询方法的情况下,测试不同方法的性能非常重要。

程序清单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
【加入到收藏夹】告诉好友】【打印此文】【关闭窗口
  版权声明:本站提供的“一种基于记录集查找特定行的方法”版权归文章所有者,转载请注明出处!
 ·上一篇文章:在英文NT及SQL下实现页面内的中文出现      ·下一篇文章:一个有关DISTINCT的问题解答
相关文章
·十一种常见“流氓软件”完全卸载方法[52]
·一种动态网络负载平衡集群的实践方法[69]
·一种使能XML数据库的映射及转换研究[51]
·XML成为DB2 9数据库的一种内置数据结构[62]
·一种基于Struts的Web应用开发环境[11]
网站主页 | 收藏本页 | 联系我们 | 广告服务 | 站点地图 | 会员注册 | 招聘信息 | 内容指正

联系QQ:先飞电脑技术网站事务联系QQ,点击可以直接留言. 32933427 电话:13710542091 [世界排名] 鄂ICP备05005890号