当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 一种基于记录集查找特定行的方法

MSSQL
如何让新安装的MySQL数据库变得更安全
考虑SQL Server安全时所应注意的几个方面
快速解决SQL server 2005孤立用户问题
比较一下看看自己掌握了多少SQL快捷键
怎样在SQL Server 2005中用证书加密数据
讲解使用SQL Server升级顾问的详细步骤
讲解设计应用程序时避免阻塞的八个准则
配置SQL Server文件组对应不同的RAID系统
讲解数据库管理系统必须提供的基本服务
讲解SQL Server2005数据项的分拆与合并
SQL Server数据库动态交叉表的参考示例
SQL SERVER 2005中的同步复制技术
SQL Server查询速度慢的原因及优化方法
减少SQL Server死锁的方法
sql server 视图作用
扩展数据库系统选项实现更高的可扩展性
SQL Server开发过程中的的常见问题总结
对跨多个表格的数据组合时需要用到的SQL
SQL Server 2005 FOR XML嵌套查询使用详解
另类解读SQL Server中的DateTime数据类型

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 107 ::
收藏到网摘: n/a

 

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