34

ページングに共通テーブル式を使用しています。

with query as (
  Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
Select * from query where TableRowNum between 1 and 25 Order By TableRowNum ASC

このクエリを実行した直後に、アイテムの総数を取得するために、ほぼ同じクエリを実行します。

with query as (
  Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
Select Count(*) from query

これらを組み合わせてみました(つまり、CTEを定義し、データをクエリしてからカウントをクエリしますが、これを行うと、2番目のクエリ(カウント)。

DBへのラウンドトリップを節約するために、これら2つのクエリを1つに結合する方法はありますか?

4

3 に答える 3

43

2つの異なるクエリでそれらを必要としない場合は、試すことができます

;with query as (
  Select Row_Number() over (Order By UserID ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
),
totalCount AS (
    SELECT COUNT(1) Total FROM query
)
Select  query.*,
        Total
from    query, totalCount 
where   TableRowNum 
between 1 and 25 
Order By TableRowNum ASC

2つの異なるクエリが必要な場合は、テーブル変数を使用してください

DECLARE @User TABLE(
        TableRowNum INT,
        FirstName VARCHAR(50),
        LastName VARCHAR(50)
)
;with query as (
  Select Row_Number() over (Order By UserID ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
INSERT INTO @User
SELECT  TableRowNum,
        FirstName,
        LastName
FROM    query

SELECT  *
FROM    @User
where   TableRowNum 
between 1 and 25 
Order By TableRowNum ASC

SELECT COUNT(1) FROM @User
于 2009-11-26T07:08:31.270 に答える
2

あなたはこのようにそれを行うことができます:

with query as (
   Select 
 COUNT (*) OVER (PARTITION BY 1) AS TableTotalRows,
 Row_Number() over (Order By OrderNum ASC) as TableRowNum,
     FirstName,
     LastName
  From   Users
)
于 2011-05-09T15:20:14.227 に答える
2

このリンクのマイクロソフトによると:

CTEは、それ自体と以前に定義されたCTEを同じWITH句で参照できます。

以前に定義されたCTEを参照するその新しいCTEで、カウントクエリを実行できます。

;with query as (
  Select Row_Number() over (Order By UserID ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
),
totalCount AS (
    SELECT COUNT(1) Total FROM query
)
Select  query.*,
        Total
from    query, totalCount 
where   TableRowNum 
between 1 and 25 
Order By TableRowNum ASC

'query'はメインCTEであり、'totalCount'は合計行数を取得するためにそれを使用しています

Microsoftには、このような一般的なタスクの例が必要です。

于 2012-11-23T15:41:33.073 に答える