国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

一種基于記錄集查找特定行的方法

2024-07-21 02:31:09
字體:
來源:轉載
供稿:網友

問:我的一個表中包含了名為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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台中县| 昭通市| 沙田区| 松原市| 蕲春县| 盐源县| 西和县| 来凤县| 达日县| 望江县| 张北县| 长岭县| 繁峙县| 惠东县| 泗阳县| 宜兴市| 疏勒县| 裕民县| 阜新| 尼木县| 上虞市| 长子县| 冀州市| 威远县| 株洲县| 桃园市| 司法| 漯河市| 阿克苏市| 宣恩县| 额尔古纳市| 永城市| 新田县| 定结县| 怀化市| 台南市| 高淳县| 同江市| 古丈县| 武城县| 兴义市|