sql >> データベース >  >> RDS >> Sqlserver

ページング中に合計行数を取得する

    クエリを 2 回実行する必要はありません。

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

    チャット に基づく 、あなたの問題はもう少し複雑なようです - あなたは DISTINCT を適用しています ページングに加えて結果に。これにより、COUNT() が何であるかを正確に判断するのが複雑になる可能性があります。 のように見え、どこに行くべきか。 1 つの方法を次に示します (チャットからのはるかに複雑なクエリにテクニックを組み込むのではなく、これを実証したいだけです):

    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;
    

    クリーンアップ:

    DROP TABLE dbo.PagingSample;
    GO
    


    1. 変数が値phpに等しい場合

    2. PostgreSQLで一連の繰り返し番号を生成するにはどうすればよいですか?

    3. 右結合サブクエリ内のMysqlアクセスメインテーブル

    4. UML表記