查詢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 的優點:
以上是如何在SQL Server中有效率地選擇特定數量的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!