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

时间:2013-04-23 17:53:00

标签: 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中是否有一种方法可以在应用top之前返回select top查询的受影响行数? @@ 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; 

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

假设您希望通过id升序排名前5位,这将通过您的表单次传递来完成。

; WITH Everything AS 
(
    SELECT id
        , a
        , b
        , c
        , ROW_NUMBER() OVER (ORDER BY id ASC) AS rn_asc
        , ROW_NUMBER() OVER (ORDER BY id DESC) AS rn_desc
    FROM <table>
)
SELECT id
    , a
    , b
    , c
    , rn_asc + rn_desc - 1 AS total_rows
FROM Everything
WHERE rn_asc <= 5

答案 2 :(得分:0)

**更新**

这就是我现在正在做的事情,虽然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;