首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 集合式查詢:不使用游標尋找目標列前後相鄰列的兩種高效寫法

     編輯:MySQL 資料庫相關知識

需求:給定 OrderId,找出其前一筆與後一筆 (依 OrderId 排序)。游標效能差,本文提供兩種集合式寫法並比較效能。

環境

Northwind Orders 表,主鍵 OrderId。

方案一:MIN/MAX + OR 邏輯 (通用、易讀)

DECLARE @TargetOrder INT = 10330
SELECT * FROM Orders
WHERE OrderId = (SELECT MAX(OrderId) FROM Orders WHERE OrderId < @TargetOrder)
   OR OrderId = (SELECT MIN(OrderId) FROM Orders WHERE OrderId > @TargetOrder)
  • 兩次子查詢分別取得前一筆最大值、後一筆最小值。
  • 若目標為最小值,前一筆子查詢回傳 NULL,整體回傳空集 (符合邏輯)。

方案二:TOP 3 + 範圍過濾 (效能略優)

DECLARE @TargetOrder INT = 10330
SELECT TOP 3 *
FROM Orders
WHERE OrderId >= (SELECT MAX(OrderId) FROM Orders WHERE OrderId < @TargetOrder)
ORDER BY OrderId
  • 先找前一筆最大值作為下界,向後取 3 筆 (含前一筆、目標、後一筆)。
  • 若目標為最小值,下界子查詢回傳 NULL,WHERE OrderId >= NULL 導致無資料 (行為與方案一不同,需注意)。

效能比較 (SHOWPLAN / STATISTICS IO)

  • 方案二掃描頁數略少、CPU 略低,效能微幅領先。
  • 差異因樣本資料小而不明顯;大資料量下建議實測兩種寫法。

核心啟示

  1. 集合式思維:善用 MIN/MAX、TOP 替代游標逐列邏輯。
  2. 同一需求常有多種寫法,**務必實測執行計畫與 IO 統計** 選擇最優。
  3. 邊界條件 (首筆/末筆) 語意需與業務對齊,兩方案行為不同。

總結

尋找相鄰列無需游標。方案一 (MIN/MAX) 語意清晰、邊界處理自然;方案二 (TOP) 效能略優但邊界行為不同。生產環境建議以方案一為主,效能敏感場景實測後採用方案二。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved