2009-02-05 15 views

risposta

24

non si potrebbe fare qualcosa di simile

SELECT ... FROM ... 
WHERE PK NOT IN (SELECT TOP 10 PK FROM ...) 
ORDER BY ... 

potrebbe non essere così efficiente, ma questo è l'unico modo in cui la parte superiore della mia testa mi viene in mente di fare una cosa del genere. Per quanto ne sappia non c'è nessuna clausola "basso" in SQL :)

+0

che ha funzionato, grazie! –

+0

È stata una domanda di intervista per me una volta. Ho risposto in modo simile allo –

6
SELECT ... FROM .... 
WHERE myID NOT IN 
    (SELECT TOP 10 myID FROM ... ORDER BY rankfield) 
ORDER BY sortfield 

Nota che il vostro ordine ordinato potrebbe, (se lo si desidera) essere diverso da quello del ordine di classifica.

Edit: Un'altra idea: se si sapeva già quante righe TOTALI erano lì, si potrebbe fare (supponendo 1000 righe):

SELECT TOP 990 ... FROM .... ORDER BY sortfield DESC 

Basta capovolgere il genere, e prendere la parte restante.

Naturalmente, se si voleva ancora i risultati nell'ordine originale, che avrebbe dovuto fare qualcosa di stupido come:

SELECT ... 
FROM (SELECT TOP 990 ... FROM .... ORDER BY sortfield DESC) 
ORDER BY sortfield ASC 
+0

. Mi aspetterei che quest'ultimo sia molto più veloce di NOT IN, perché NOT IN non utilizza gli indici in modo efficiente. In effetti, potrebbe essere più veloce ottenere il recordcount con DCount() e quindi ottenere il resto dei record. –

3

Si tratta di qualcosa che viene spesso fatto meglio sul lato "client", piuttosto sul DBMS, cioè recupera tutte le righe della tabella in un recordset ADO Classic, quindi usa la proprietà Filter per rimuovere le 10 righe in base a criteri, o Ordina quindi imposta quindi salta la prima/ultima 10 righe o imposta la lunghezza della pagina come appropriato, quindi salta la prima/ultima pagina, ecc. Non dipende solo dal numero di righe ma anche dall'applicazione di destinazione, ad es. So che se questa è l'origine dati per un report di MS Access, filtrare le righe indesiderate può essere un problema.

Problemi correlati