Chiarimento sintassi su paging

domenica 07 marzo 2010 - 11.55

ciccioherz Profilo | Junior Member

in rete ho trovato il seguente esempio di come poter eseguire una impaginazione di dati e per quanto possa sembrare un po banale, non mi è del tutto chiara la sintassi:
SELECT * FROM ( SELECT *, ROW_NUMBER() over (ORDER BY [text])
as rowww FROM dbo.test ) a WHERE rowww > 5 and rowww <= 10

in particolare, credevo che la "a" che precedere la parola chiave "where" fosse un errore di battitura dell'autore dell'articolo, ma non è così, perchè provando a rimuovarla il motore mi da errore sulla query..
cosa significa quella "a"?

grazie

lbenaglia Profilo | Guru

>cosa significa quella "a"?
E' un alias di tabella che risulta obbligatorio quando abbinato ad una tabella derivata (la SELECT compresa tra le due parentesi tonde).
Un modo forse più chiaro lo puoi ottenere utilizzando una common table expression (CTE):

WITH CTE_Paginazione AS ( SELECT *, ROW_NUMBER() OVER(ORDER BY [text]) AS riga FROM dbo.test ) SELECT * FROM CTE_Paginazione WHERE riga > 5 AND riga <= 10;

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ciccioherz Profilo | Junior Member

ok..mi è piu chiaro..non capisco ancora una cosa però, seguendo questo secondo esempio:
SELECT * FROM
( SELECT Row_Number() OVER(ORDER BY colonna1) As RowID, colonna2, colonna3
FROM Users )
As RowResults WHERE RowID Between 5 AND 10

mi chiedo come mai sia necessario la query esterna, ad esempio, io (sbagliando lo so) avrei fatto:
SELECT Row_Number() OVER(ORDER BY colonna1) As RowID, colonna2, colonna3
FROM Users
WHERE RowID Between 5 AND 10

cosa c'è di sbagliato nel mio esempio..?

lbenaglia Profilo | Guru

>mi chiedo come mai sia necessario la query esterna, ad esempio,
>io (sbagliando lo so) avrei fatto:
>SELECT Row_Number() OVER(ORDER BY colonna1) As RowID, colonna2,
>colonna3
>FROM Users
>WHERE RowID Between 5 AND 10
>
>cosa c'è di sbagliato nel mio esempio..?
Di sbagliato c'è che nel momento in cui vai a filtrare i dati con la clausola WHERE, la colonna RowID non esiste ancora, pertanto la query è logicamente errata.
La tabella derivata o la CTE vengono eseguite prima rispetto all'outer query, pertanto a questo punto è possibile filtrare le righe per la colonna RowID.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ciccioherz Profilo | Junior Member

giusto..ci sarei dovuto arrivare da solo..grazie ancora
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5