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 NumericoNella 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: |