Come posso riutilizzare un'espressione di tabella comune
-
05-07-2019 - |
Domanda
Sto usando un'espressione di tabella comune per il paging:
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
Immediatamente dopo aver effettuato questa query, faccio una query quasi identica al fine di recuperare il numero totale di elementi:
with query as (
Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Select Count(*) from query
Ho provato a combinarli insieme (es .: definire il CTE, interrogare i dati e quindi interrogare il conteggio, ma quando lo faccio, ricevo un messaggio di errore "query" nome oggetto non valido "in risposta al seconda query (il Conte).
Esiste un modo per combinare queste due query in una sola, per salvare un viaggio di andata e ritorno nel DB?
Soluzione
Se non le richiedi in 2 query diverse, puoi provare
;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
Se sono necessarie 2 query diverse, utilizzare piuttosto una tabella 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
Altri suggerimenti
Puoi farlo in questo modo:
with query as (
Select
COUNT (*) OVER (PARTITION BY 1) AS TableTotalRows,
Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Secondo Microsoft in questo link :
Un CTE può fare riferimento a se stesso e CTE precedentemente definiti nello stesso CON clausola.
In quel nuovo CTE che fa riferimento al CTE definito in precedenza, possiamo eseguire la query di conteggio:
;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' è il CTE principale e 'totalCount' lo sta usando per ottenere il conteggio totale delle righe
Microsoft dovrebbe avere un esempio per un'attività comune come questa.