查询 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中文网其他相关文章!