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

中发必胜

中发必胜

2016-01-29 16:19

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

问:我的一个表中包含了名为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()函数查找目标行

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

DECLARE @TargetOrder int

SET @TargetOrder=10330

FROM Orders

WHERE OrderId=@TargetOrder

OR OrderId=(SELECT MAX(OrderId)

FROM orders WHERE OrderId < @TargetOrder)

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

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

 

 
展开更多 50%)
分享

猜你喜欢

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

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

记录集内随机取记录的代码

Web开发
记录集内随机取记录的代码

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在ASP中使用断开的记录集

ASP
在ASP中使用断开的记录集

ASP程序中使用断开的数据记录集

ASP
ASP程序中使用断开的数据记录集

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在ASP中轻松实现记录集分页显示

ASP
在ASP中轻松实现记录集分页显示

SQL查找某一条记录的方法

编程语言 网络编程
SQL查找某一条记录的方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

网管经验谈“只出不进”故障的处理

网管经验谈“只出不进”故障的处理

安全防御系统新趋势 IPS筛选八大定律

安全防御系统新趋势 IPS筛选八大定律
下拉加载更多内容 ↓