Lorenzo Braidi
TIPS - La paginazione
   
:: Consulenza
Home Page
Consulenza
Formazione
 
:: Editoria
Articoli
Libri
Tips!
Recensioni
 
:: Risorse
Documenti
Software
Link
 
:: Lorenzo
Blog
Curriculum
 
:: Newsletter



Gli indirizzi registrati NON saranno ceduti a
terzi, nè utilizzati per scopi differenti da quelli indicati.

 

 


Ho visto su alcuni blog tecnici che il mio articolo sulla paginazione dei dati pubblicato su Computer Programming n. 140 (Novembre 2004) sta facendo discutere.
Innanzitutto riporto di seguito la schematizzazione della soluzione che propongo nell'articolo così come l'ha rielaborata Riccardo Golia nel suo blog


SELECT TOP [dimPage] [field1], [field2], ...
FROM (SELECT TOP [dimPage] [field1], [field2], ...
FROM (SELECT TOP ([dimPage] * [numPage]) [field1], [field2], ...
FROM [table]
WHERE [conditions]
ORDER BY [order] ASC) AS TMP1
ORDER BY [order] DESC) AS TMP2
ORDER BY [order] ASC

I principali dubbi che ho avuto modo di leggere riguardano in particolare la possibilità di ottenere il numero totale dei record che fanno parte del resultset che si vuole trattare. Perché si possa ottenere tale informazione è necessario eseguire a priori una select count che estragga il dato e successivamente si procederà con l'estrazione della pagina desiderata.

Faccio notare che, come detto anche nell'articolo, se non si conosce a priori il numero totale dei record coinvolri, non è possibile sfruttare in maniera ottimale la soluzione descritta.
Se per esempio abbiamo una tabella con 100 record e li vogliamo visualizzare raggruppati in pagine da 20 righe ciascuna, il risultato sarà corretto per le prime 5. Nel momento, però, in cui richiederemo la visualizzazione della sesta pagina, otterremo gli stessi venti record che comparivano nella quinta. Questo comportamento può essere evitato solo se si conosce a priori il numero totale dei record e così anche il numero di pagine che ne deriveranno.

In un commento di uno dei blog che ho letto, poi, veniva proposta una soluzione alternativa. La soluzione prevede sostanzialmente di estrarre con una query tutti i record che si vogliono "saltare" e con una seconda query di individuare quelli della pagina richiesta.

SELECT TOP 20 *
FROM Tabella
WHERE Chiave NOT IN (
    SELECT TOP 60 Chiave
    FROM Tabella
    ORDER BY Chiave))
ORDER BY Chiave

La soluzione è senz'altro corretta, ma si deve prestare attenzione al fatto che essa funziona correttamente solo se si utilizza come criterio di ordinamento la chiave della tabella o un suo equivalente.

   

Tutti i diritti riservati
Lorenzo Braidi 2003 - 2005