Comment puis-je réutiliser une expression de table commune
-
05-07-2019 - |
Question
J'utilise une expression de table commune pour la pagination:
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
Immédiatement après avoir effectué cette requête, je fais une requête presque identique afin de récupérer le nombre total d'éléments:
with query as (
Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Select Count(*) from query
J'ai essayé de les combiner ensemble (c'est-à-dire: définir le CTE, interroger les données, puis interroger le compte, mais je reçois alors un message d'erreur "Nom d'objet non valide 'requête'" en réponse au message deuxième requête (le compte).
Existe-t-il un moyen de combiner ces deux requêtes en une seule pour enregistrer un aller-retour vers la base de données?
La solution
Si vous n'en avez pas besoin dans 2 requêtes différentes, vous pouvez essayer
;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
Si vous avez besoin de 2 requêtes différentes, utilisez plutôt une 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
Autres conseils
Vous pouvez le faire comme ceci:
with query as (
Select
COUNT (*) OVER (PARTITION BY 1) AS TableTotalRows,
Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Selon Microsoft, dans ce lien :
Un CTE peut référencer lui-même et des CTE précédemment définis dans le même Clause WITH.
Dans ce nouveau CTE faisant référence au CTE défini précédemment, nous pouvons effectuer la requête de comptage:
;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" est le CTE principal et "totalCount" l'utilise pour obtenir le nombre total de lignes
Microsoft devrait avoir un exemple pour une tâche courante comme celle-ci.