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,查询数据,然后查询 Count,但是当我这样做时,我收到一条错误消息“Invalid object name 'query'”以响应第二个查询(Count )。

有没有办法将这两个查询合并为一个,以节省到数据库的往返行程?

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 个不同的查询,请使用 table var

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 可以在同一个 WITH 子句中引用自身和先前定义的 CTE。

在引用先前定义的 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' 使用它来获取总行数

微软应该有一个这样的常见任务的例子。

于 2012-11-23T15:41:33.073 回答