sql-server - T-SQL 在应用 TOP 之前获取行数

标签 sql-server tsql select

我有一个 SELECT 可以从表中返回数百行(表可以大约 50000 行)。我的应用程序有兴趣了解返回的行数,这对我来说很重要,但它实际上只使用这数百行中的前 5 行。我想要做的是将 SELECT 查询限制为仅返回 5 行,但同时也告诉我的应用程序它将返回多少行(数百行)。这是原始查询:

SELECT id, a, b, c FROM table WHERE a < 2

这是我想到的 - CTE - 但我对每列中出现的总行数感到不舒服。理想情况下,我想要 TOP 5 的结果集和总行数的返回参数。

WITH Everything AS
(
   SELECT id, a, b, c FROM table
),
DetermineCount AS
(
   SELECT COUNT(*) AS Total FROM Everything 
)
SELECT TOP (5) id, a, b, c, Total
FROM Everything 
CROSS JOIN DetermineCount;

你能想到更好的方法吗?

T-SQl 中是否有一种方法可以在应用顶部之前返回选择顶部查询的受影响行数? @@rowcount 会返回 5,但我想知道是否有 @@rowcountbeforetop 之类的东西。

预先感谢您的帮助。

** 更新 **

这就是我现在正在做的事情,尽管 CTE 如此优雅,但我有点喜欢它而不是 CTE。

-- @count is passed in as an out param to the stored procedure

CREATE TABLE dbo.#everything (id int, a int, b int, c int);

INSERT INTO #everything 
SELECT id, a, b, c FROM table WHERE a < 2;      

SET @count = @@rowcount;
SELECT TOP (5) id FROM #everything;
DROP TABLE #everything; 

最佳答案

这是一种相对有效的方法来获取 5 个随机行并包含总计数。无论你把它放在哪里,随机元素都会引入完整排序。

SELECT TOP (5) id,a,b,c,total = COUNT(*) OVER()
  FROM dbo.mytable
  ORDER BY NEWID();

关于sql-server - T-SQL 在应用 TOP 之前获取行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16175955/

相关文章:

SQL身份(1,1)从0开始

sql - 从父子表生成字符串树分支

sql-server-2008 - SQL按年份分组

MySQL 在 WHERE 语句中使用 SELECT - 最好的方法?

mysql - 显示所有日期和日期,无论是否存在记录

mysql - 如果字段为空,为什么 SQL "NOT IN (' val 1')"不返回?

sql - 在sql中将十六进制转换为字符串

c# - 扩展函数不能返回空值

sql-server - 是否有理由在可为空的列上指定 DEFAULT (NULL)?

SQL 脚本的正则表达式前瞻/后视匹配