【发布时间】:2013-04-17 01:22:58
【问题描述】:
我有一个 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;
【问题讨论】:
-
执行两个查询有什么问题?一个带有 SELECT COUNT(*),一个带有 TOP?
-
您不应该使用没有 ORDER 子句的 TOP。你如何定义TOP?
-
@DeCaf 好点,但它看起来很安静,你不觉得吗?特别是如果选择最终增长到多个连接或条件。但是,是的,这会以冗余代码为代价给我想要的东西。
-
@NickVaccaro 很好的观察,在这种情况下我只想要一个随机的 5,订购对应用程序来说意义不大。
-
那么
TOP没有ORDER BY不会给你“随机”...
标签: sql-server tsql select