Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich die Gesamtzahl der Zeilen beim Paging

Sie müssen die Abfrage nicht zweimal ausführen.

SELECT ..., total_count = COUNT(*) OVER()
FROM ...
ORDER BY ...
OFFSET 120 ROWS
FETCH NEXT 10 ROWS ONLY;

Basierend auf dem Chat , scheint Ihr Problem etwas komplexer zu sein - Sie wenden DISTINCT an zum Ergebnis zusätzlich zum Paging. Dies kann es schwierig machen, genau zu bestimmen, was COUNT() ist aussehen soll und wohin es gehen soll. Hier ist eine Möglichkeit (ich möchte dies nur demonstrieren, anstatt zu versuchen, die Technik in Ihre viel komplexere Abfrage aus dem Chat zu integrieren):

USE tempdb;
GO
CREATE TABLE dbo.PagingSample(id INT,name SYSNAME);

-- insert 20 rows, 10 x 2 duplicates
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;

SELECT COUNT(*) FROM dbo.PagingSample; -- 20

SELECT COUNT(*) FROM (SELECT DISTINCT id, name FROM dbo.PagingSample) AS x; -- 10

SELECT DISTINCT id, name FROM dbo.PagingSample; -- 10 rows

SELECT DISTINCT id, name, COUNT(*) OVER() -- 20 (DISTINCT is not computed yet)
 FROM dbo.PagingSample
 ORDER BY id, name
 OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY; -- 5 rows

-- this returns 5 rows but shows the pre- and post-distinct counts:
SELECT PostDistinctCount = COUNT(*) OVER() -- 10, 
  PreDistinctCount -- 20, 
  id, name 
FROM 
(
  SELECT DISTINCT id, name, PreDistinctCount = COUNT(*) OVER() 
    FROM dbo.PagingSample
    -- INNER JOIN ...
) AS x
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY;

Aufräumen:

DROP TABLE dbo.PagingSample;
GO