在舊版 SQL Server 版本中複製 MySQL 的 LIMIT
問題: SQL Server 2000 缺少 MySQL、PostgreSQL 和 SQLite 等資料庫中用於檢索特定行範圍的直接 LIMIT
子句。 本文探討了不使用遊標、T-SQL 或預存程序的解決方法。
解(有限制):
如果沒有額外的構造,在 SQL Server 2000 中直接模擬 LIMIT
是不可能的。 然而,這些方法在特定情況下有效:
方法 1:利用唯一密鑰
只有當您的結果集包含唯一列(例如主鍵)時,此方法才有效:
<code class="language-sql">SELECT TOP n * FROM tablename WHERE key NOT IN ( SELECT TOP x key FROM tablename ORDER BY key );</code>
這裡,x
代表偏移量,n
代表要檢索的行數。 內部查詢排除前 x
行,外部查詢選擇後續 n
行。
方法二:模擬行編號
如果可以產生行號(儘管這需要一些操作),則可以使用子查詢和 BETWEEN
:
<code class="language-sql">SELECT z2.* FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) as rn, * FROM mytable ) z2 WHERE z2.rn BETWEEN x + 1 AND x + n;</code>
(注意:ROW_NUMBER()
在SQL Server 2000 中不可用。此範例示範了這個概念;需要為SQL Server 2000 實作適當的行編號替代方案。)x
是偏移量,n
行數。
方法 3(SQL Server 2005 及更高版本 - 用於比較):
對於較新的 SQL Server 版本(2005 及更高版本),EXCEPT
語句提供了更清晰的解決方案:
<code class="language-sql">SELECT * FROM (SELECT TOP 75 COL1, COL2 FROM MYTABLE ORDER BY COL3) AS foo EXCEPT SELECT * FROM (SELECT TOP 50 COL1, COL2 FROM MYTABLE ORDER BY COL3) AS bar;</code>
這將檢索第 51-75 行。 此方法不適用於SQL Server 2000。
結論:
在 SQL Server 2000 中實作 MySQL LIMIT
的精確功能具有挑戰性。 所提供的解決方案提供了解決方法,但它們依賴特定的表結構或需要行編號的解決方法。 強烈建議升級到較新的 SQL Server 版本以獲得最佳效能和功能。
以上是如何在沒有遊標、T-SQL 或預存程序的情況下在 SQL Server 2000 中模擬 MySQL 的 LIMIT 子句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!