TOPを使用したクエリの合計行数を取得する方法
-
03-07-2019 - |
質問
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
所属していません StackOverflow