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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top