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