2009-05-20 7 views
8

Sto utilizzando la seguente istruzioneAccesso SQL utilizzando TOP 5 che restituisce più di 5 risultati?

SELECT TOP 5 rootcause, COUNT(IIF(accountability="Team 1",1,0)) 
FROM MOAQ 
WHERE CDT=1 
GROUP BY rootcause 

MOAQ è un'altra query che restituisce circa 20 campi da 4 tavoli, niente di speciale. Funziona come previsto e ottengo 5 risultati.

Se aggiungo una clausola ORDER BY sul campo condizionale sebbene inizi a ottenere 8 risultati. Se ordino dal primo campo non ci sono problemi.

Qualcuno sa cosa potrebbe succedere?

Modifica per chiarire - Sto testando solo da Access 2003 a questo punto, l'istruzione finale verrà parametrizzata tramite ADO dal front-end Excel.

+0

Proviene da Access o accedete a Access da un programma? Se quest'ultimo, quale stringa di connessione stai usando? Con quale versione di Access stai lavorando? – AnonJr

risposta

28

Questo è un effetto noto della direttiva top in Access, ma non è molto conosciuto ...

La direttiva top non restituisce i primi n articoli, secondo quanto si è facilmente portati a credere. Invece restituisce almeno n elementi distinti determinati dall'ordinamento del risultato.

Nella maggior parte dei casi è lo stesso, ma nel tuo esempio in cui gli articoli dal 5 ° all'8 ° hanno lo stesso valore di ordinazione, sono tutti inclusi. Restituisce i primi cinque elementi, ma anche tutti gli articoli che hanno lo stesso valore di ordinazione del quinto elemento.

Se non si applica alcun ordine alla tabella, vengono considerati tutti i campi, quindi se si dispone di un campo univoco nel risultato, la query restituirà sempre cinque elementi. Lo stesso ovviamente se il campo unico è incluso nell'ordinamento.

Altri dialetti di SQL possono comportarsi in modo diverso. La direttiva top da sola in T-SQL (SQL Server), ad esempio, non restituisce mai più di n articoli. Tuttavia, specificando le clausole with ties e order by insieme a top, si può osservare lo stesso comportamento di Access.

+2

+1 interessante! Effetti noti che non sono noti – Andomar

+0

Molto interessante, grazie – Lunatik

1

Andare alla pagina dei nomi della Guida di Access 2003 About ANSI SQL query mode (MDB) quindi espandere 'Perché utilizzare ANSI-92 SQL?' soggetto e vedrete questo:

"Uso il limite a nn RIGHE clausola per limitare il numero di righe restituite da una query"

Così appena messo l'interfaccia utente di accesso in modalità query ANSI-92 o utilizzare OLE DB (ad es. ADO) nel codice e aggiungere la clausola

LIMIT TO 5 ROWS 

alla vostra domanda.

...

Solo scherzando! Questo è semplicemente un altro esempio di come il motore di database di Access è scarsamente documentato. Penso che qualcuno del team addetto alla documentazione di Access abbia assunto il presupposto non troppo irragionevole che la cosiddetta modalità di interrogazione ANSI-92 del motore di database Access sarebbe conforme allo standard ISO/ANSI SQL-92. Non è.

Il motore di database di Access ha una sintassi proprietaria (cioè non standard SQL-92) TOP n (da non confondere con la sintassi TOP n proprietaria di SQL Server che è semanticamente diversa). In poche parole, non risolve i duplicati.Se i criteri soddisfano ogni riga della tabella, otterresti ogni riga della tabella nel set di risultati.

La soluzione alternativa consiste nell'utilizzare un cursore per leggere solo le prime n righe nel gruppo di risultati. Poiché SQL del database di Access non supporta codice procedurale o cursori espliciti, devi eseguire questa operazione sul lato "client", ad es. aprire un oggetto Recordset e leggere i primi n record in un recordset ADO fabbricato.

+1

L'altra soluzione alternativa, come implicita nell'altra risposta di cui sopra, consiste nel selezionare un campo "tie-breaker", come un campo chiave primaria, e aggiungerlo all''ORDINE DI 'clausola. –

Problemi correlati