Queries

2.26 Esempio dell'uso delle Subquery (1)
  Roberto, Giorgio Rancati

Ipotiziamo di avere una tabella TblPunteggi che abbia la seguente struttura:
IdPunteggio      Contatore e chiave primaria
NomeAtleta      Testo
DataGara         Data/ora
Punteggio        Numerico
Nella tabella vengono memorizzati i puntegi di tutte le gare di tutti gli atleti.
Se voglio visualizzare in una query solamente i tre migliori risultati di ogni atleta, tale query potrebbe avere il seguente codice SQL:
SELECT *
FROM TblPunteggi
WHERE (((DCount("*","TblPunteggi","NomeAtleta =" & Chr$(34) & [NomeAtleta] & Chr$(34) & " AND Punteggio >=" & [Punteggio]))<=3))
ORDER BY NomeAtleta, Punteggio DESC;
Questo è il codice SQL della query che è contenuta nel database di esempio allegato a questa FAQ con il nome ConDCount
La query di cui sopra sicuramente visualizzerà quanto desiderato, ma presenta due inconvenienti: se i record sono molti potrebbe risultare abbastanza lenta ed inoltre risulta non trasportabile su piattaforme diverse da Access visto che fa riferimento a una funzione proprietaria quale Dcount.

Per migliorare la performance della query e rendere il codice SQL trsportabile su altre piattaforme, si può sostituire la funzione di aggregazione sui dominii DCount con una subquery; la query così modificata avrà il seguente codice SQL:
SELECT *
FROM TblPunteggi
WHERE Punteggio IN (SELECT TOP 3 Punteggio
                                     FROM TblPunteggi As T
                                     WHERE T.NomeAtleta = TblPunteggi.NomeAtleta
                                     ORDER BY T.Punteggio DESC)
ORDER BY TblPunteggi.NomeAtleta, TblPunteggi.Punteggio DESC;
Questo è il codice SQL della query che è contenuta nel daatbase di esempio allegato a questa FAQ con il nome ConSubquery.

La struttura di query con subquery di cui sopra potrebbe essere usata nel caso si abbia una tabella listino che contiene tutti i prodotti e per ogni prodotto tutti i prezzi che quel prodotto ha avuto nel tempo con indicata, per ogni prezzo, la data di decorrenza, e si voglia visualizzare invece per ogni prodotto solamente l'ultimo prezzo (quello con data più recente).

Download:
 
  Subquery1.zip (11Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.