Подтвердить что ты не робот

Как я могу повторно использовать выражение Common Table

Я использую выражение Common Table для подкачки:

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, запросить данные и затем запросить счетчик, но когда я это сделаю, я получаю сообщение об ошибке "Недопустимое имя объекта" запрос "в ответ на второй запрос (граф).

Есть ли способ объединить эти два запроса в один, чтобы сохранить обратную связь с БД?

4b9b3361

Ответ 1

Если вы не требуете их в двух разных запросах, вы можете попробовать

;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 разных запроса, скорее используйте таблицу 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

Ответ 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
)

Ответ 3

Согласно Microsoft в этой ссылке:

CTE может ссылаться на себя и ранее определенные CTE в том же WITH.

В этом новом CTE, ссылающемся на предыдущий определенный CTE, мы можем сделать запрос count:

;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 должен быть пример общей задачи, подобной этой.