4

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

3 回答 3

4

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

SELECT TOP (5) id,a,b,c,total = COUNT(*) OVER()
  FROM dbo.mytable
  ORDER BY NEWID();
于 2013-04-23T18:33:21.533 回答
2

假设您希望前 5 个按 id 升序排序,这将通过您的表进行一次传递。

; 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
于 2013-04-23T18:03:06.193 回答
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; 
于 2013-04-23T18:49:02.097 回答