質問

SQL Server 2008クエリがあります

SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...

行の合計数も取得したい。厄介な方法は、2番目のクエリを作成することです

SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...

効率的な方法はありますか?

ありがとう

役に立ちましたか?

解決

2番目のクエリが必要ですか?

SELECT TOP 10
    *, foo.bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

または

DECLARE @bar int
SELECT @bar = COUNT(*) AS bar FROM T WHERE ...
SELECT TOP 10
    *, @bar
FROM
    T
    CROSS JOIN
    (SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
    ...
ORDER BY
    ...

または(編集:WITHを使用)

WITH cTotal AS
(
    SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
    *, cTotal .bar
FROM
    T
WHERE
    ...
ORDER BY
    ...

他のヒント

この回答の内容は機能しているようです:

https://stackoverflow.com/a/19125458/16241

基本的には次のことを行います:

SELECT top 100 YourColumns, TotalCount = Count(*) Over()
From YourTable
Where SomeValue = 32

TotalCountには、行の総数が含まれます。ただし、各行にリストされています。

これをテストしたとき、クエリプランはテーブルが1回だけヒットしたことを示しました。

2番目のクエリからORDER BY句も削除します。

いいえ。

SQL Server は、 MyISAM などのメタデータに COUNT(*)を保持せず、毎回計算します。

更新:見積もりが必要な場合は、統計メタデータを使用できます:

SELECT  rows
FROM    dbo.sysindexes
WHERE   name = @primary_key,

@primary_key はテーブルの主キー名です。

これは、最後の統計更新からの COUNT(*)を返します。

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top