Problemi con la SELECT TOP in MS Access

sqlPer chi crea siti Web capita prima o poi di trovarsi davanti ad un problema insormontabile: lavorare in ASP+Access, l’accoppiata vincente di Microsoft oramai superata in tutto e per tutto dal binomio PHP+MySQL. Tuttavia non tutto è perduto e ci armiamo di buona pazienza in modo da far funzionare tutto per il meglio, quando ecco sorgere problemi insospettabili. Supponiamo ad esempio di voler caricare dal DB un numero limitato di risultati di una query, caso tipico della LIMIT di MySQL e della TOP per i sistemi Microsoft, ad esempio per un sistema di visualizzazione delle news. Supponendo di avere un codice SQL del tipo:

SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC

Ci aspettiamo che il codice qui sopra carichi dal DB esattamente i primi 5 risultati delle news ordinate per data. Cosa accade però se in lista ci sono più eventi della stessa giornata dei quali non abbiamo definito un ordinamento? Un caso d’esempio della tabella tbEventi è questo qui sotto:

ID	Titolo	Testo	Data
----------------------------------
1	Titolo1	Testo1	19/05/2009
2	Titolo2	Testo2	19/05/2009
3	Titolo3	Testo3	18/05/2009
4	Titolo4	Testo4	17/05/2009
5	Titolo5	Testo5	17/05/2009
6	Titolo6	Testo6	17/05/2009
7	Titolo7	Testo7	16/05/2009
8	Titolo8	Testo8	16/05/2009

In questo caso avrete come risultato della query questo:

ID	Titolo	Testo	Data
----------------------------------
1	Titolo1	Testo1	19/05/2009
2	Titolo2	Testo2	19/05/2009
3	Titolo3	Testo3	18/05/2009
4	Titolo4	Testo4	17/05/2009
5	Titolo5	Testo5	17/05/2009
6	Titolo6	Testo6	17/05/2009
7	Titolo7	Testo7	16/05/2009
8	Titolo8	Testo8	16/05/2009

Che è esattamente la tabella iniziale. Come mai? E’ molto semplice, a date uguali viene data la stessa importanza, si verifica cioè un aexequo che porta come risultato l’uscita di tutte le entry con le prime 5 date disponibili, ed in questo caso avremo il 19, il 18, il 17 ed il 16 maggio.

Come risolvere?

Facile, ci sono 2 modi: o definiamo un secondo modo di ordinamento, come questo:

SELECT TOP 5 * FROM tbEventi ORDER BY Data, Titolo DESC

In modo da permettere all’engine di discriminare tra entry della stessa data, oppure in una maniera più “sporca” facendo una sotto-query:

SELECT TOP 5
FROM (SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC)
ORDER BY Data DESC

Fine. Se vi vengono in mente altre modalità per risolvere il problema, fatemelo sapere!

This entry was posted in ASP, Programmazione, SQL and tagged , , , , , . Bookmark the permalink.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>