sql >> Databasteknik >  >> RDS >> Sqlserver

Få totalt antal rader vid personsökning

Du behöver inte köra frågan två gånger.

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

Baserat på chatten , det verkar som om ditt problem är lite mer komplext - du använder DISTINCT till resultatet förutom personsökning. Detta kan göra det komplicerat att bestämma exakt vad som är COUNT() ska se ut och vart den ska gå. Här är ett sätt (jag vill bara demonstrera detta istället för att försöka införliva tekniken i din mycket mer komplexa fråga från chatten):

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;

Städa upp:

DROP TABLE dbo.PagingSample;
GO


  1. Hoppa över infogning vid dubblettpost i mysql

  2. en-till-många-relation med databasbegränsning och invers=true

  3. Importera råbyte som råbyte i R

  4. PostgreSQL, kan inte uppdatera rad (med säkerhet på radnivå)