我有一个可以从表中返回数百行的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;
答案 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;