Come recuperare il conteggio totale delle righe di una query con TOP
-
03-07-2019 - |
Domanda
Ho una query di SQL Server 2008
SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...
Vorrei ottenere anche il numero totale delle righe. Il modo ossessivo è fare una seconda query
SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
Esiste un metodo efficiente?
Grazie
Soluzione
Vuoi una seconda query?
SELECT TOP 10
*, foo.bar
FROM
T
CROSS JOIN
(SELECT COUNT(*) AS bar FROM T WHERE ...) foo
WHERE
...
ORDER BY
...
o
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
...
Oppure (Modifica: usando WITH)
WITH cTotal AS
(
SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
*, cTotal .bar
FROM
T
WHERE
...
ORDER BY
...
Altri suggerimenti
Ciò che sta in questa risposta sembra funzionare:
https://stackoverflow.com/a/19125458/16241
Fondamentalmente fai un:
SELECT top 100 YourColumns, TotalCount = Count(*) Over()
From YourTable
Where SomeValue = 32
TotalCount avrà il numero totale di righe. È elencato su ogni riga però.
Quando l'ho provato, il piano di query ha mostrato che la tabella veniva colpita una sola volta.
Rimuovi anche la clausola ORDER BY dalla seconda query.
No.
SQL Server
non mantiene COUNT (*)
in metadati come MyISAM
, lo calcola ogni volta.
AGGIORNAMENTO: Se hai bisogno di un preventivo, puoi utilizzare i metadati statistici:
SELECT rows
FROM dbo.sysindexes
WHERE name = @primary_key,
dove @primary_key
è il nome della chiave primaria della tabella.
Questo restituirà il COUNT (*)
dall'ultimo aggiornamento delle statistiche.
SELECT TOP (2) *,
(SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM T