首頁 > 資料庫 > mysql教程 > 如何在SQL Server中有效率地選擇特定數量的行?

如何在SQL Server中有效率地選擇特定數量的行?

Susan Sarandon
發布: 2024-12-29 18:46:11
原創
448 人瀏覽過

How to Efficiently Select a Specific Number of Rows in SQL Server?

在SQL Server 中選擇N 行

查詢1:

DECLARE @Range AS INT = 10

;WITH CTE AS(
    SELECT TOP (@Range) Duration = ROW_NUMBER() OVER(ORDER BY OBJECT_ID)
    FROM sys.all_columns
    ORDER BY [Object_id]
)
SELECT Duration from CTE
登入後複製

解釋>

此查詢受行數限制sys.all_columns 表。因此,將 @Range 設為 10,000 只會傳回 7,374 行,因為這是 sys.all_columns 中的行數。

查詢2:

DECLARE @start INT = 1;
DECLARE @end INT = 10;

WITH numbers AS (
    SELECT @start AS number
    UNION ALL
    SELECT number + 1 
    FROM  numbers
    WHERE number < @end
)
SELECT *
FROM numbers
OPTION (MAXRECURSION 0);
登入後複製

說明:

這個替代查詢使用遞歸公用表達式(CTE)產生從@start 到@end 的數字表。建立具有無限行數的表格時,必須使用 OPTION (MAXRECURSION 0) 來防止遞迴錯誤。

級聯CTE 解決方案:

說明:

級聯CTE 方法是建立用於大量行的「統計表」。

DECLARE @Range AS INT = 7374

;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
    SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E8
)
SELECT * FROM CteTally
登入後複製

級聯 CTE 的優點:

    產生行而無需從其他表格中讀取任何內容。
  • 可以輕鬆擴充以建立數十億的表rows。
  • 在與其他方法的效能比較中表現良好。

以上是如何在SQL Server中有效率地選擇特定數量的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板