我有一个 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/