首页 > 数据库 > mysql教程 > 如何在SQL Server中高效地选择特定数量的行?

如何在SQL Server中高效地选择特定数量的行?

Susan Sarandon
发布: 2024-12-29 18:46:11
原创
436 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板