Wie kann ich einen allgemeinen Tabellenausdruck wiederverwenden
-
05-07-2019 - |
Frage
Ich bin mit einem Common Table Expression Blätter:
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
Unmittelbar nach dieser Abfrage machen, mache ich eine fast identische Abfrage machen, um die Gesamtzahl der Elemente abzurufen:
with query as (
Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Select Count(*) from query
Ich habe versucht, diese zusammen kombiniert (dh den CTE definieren, die Daten abzufragen und dann die Count-Abfrage, aber wenn ich das tue, erhalte ich eine Fehlermeldung „Ungültige Objektnamen‚query‘“ als Antwort die die zweite Abfrage (Graf).
Gibt es eine Möglichkeit, diese beiden Abfragen in eine zu kombinieren, eine Hin- und Rückfahrt in die DB zu speichern?
Lösung
Wenn Sie nicht über sie in 2 verschiedenen Anfragen benötigen, können Sie versuchen
;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
Wenn Sie benötigen tun 2 verschiedene Abfragen, sondern eine Tabelle var verwenden
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
Andere Tipps
Sie können das tun, wie folgt:
with query as (
Select
COUNT (*) OVER (PARTITION BY 1) AS TableTotalRows,
Row_Number() over (Order By OrderNum ASC) as TableRowNum,
FirstName,
LastName
From Users
)
Laut Microsoft in diesem Link :
Ein CTE kann selbst verweisen und zuvor definiert CTEs im gleichen WITH-Klausel.
In diesem neuen CTE Referenzierung der vorherigen CTE definiert sind, können wir die Zählung Abfrage machen:
;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‘ ist der Haupt CTE und ‚totalcount‘ nutzt es für bekommen die gesamten Reihen zählen
Microsoft sollte ein Beispiel für eine gemeinsame Aufgabe wie diese hat.