2012-01-03 11 views
6

Voglio recuperare i 10 risultati inferiori da una tabella di SQL Server. Voglio che siano gli ultimi 10 dischi che sono stati inseriti, come posso fare questo?opposto di "top" in sql server, senza utilizzare l'ordine per, non ci sono chiavi/indici

Voglio scrivere select bottom 10 * from mytable tuttavia questo non esiste (afaik).

Voglio le ultime 10 righe inserite. Non c'è il timestamp.

+0

Non penso che "top" faccia quello che pensi che faccia. Inoltre, qual è la chiave primaria/ID univoco sulla tabella: è un'identità o un guid di SQLServer? –

+0

@MarkBannister non c'è nessun file – NimChimpsky

+2

Sembra che sia necessario modificare lo schema della tabella per aggiungere * qualcosa * per determinare l'ultimo ordine di inserimento - se non si ha (mai) bisogno di supportare la replica di tipo merge, una relazione IDENTITÀ può sufficiente; Altrimenti sarebbe richiesto un timestamp inserito (utile anche per l'auditing). –

risposta

15

Non è possibile.

Non vi è alcuna garanzia che gli ultimi 10 record restituiti da select * from mytable corrispondano agli ultimi 10 inseriti. Non esiste un ordine predefinito che viene utilizzato.

È necessario un ORDER BY su una colonna appropriata che riflette l'ordine degli inserti.

+0

Non esiste un ordine predefinito e questo è in base alla progettazione. Applicare un ordine deterministico quando non è impostata la clausola ORDER BY, aggiungerebbe semplicemente un sovraccarico extra senza una buona ragione. [Va bene, il commento che stavo rispondendo è stato appena rimosso ...] –

+0

quando seleziono i primi 10 * da mytable, li restituisce effettivamente nell'ordine di inserimento ...? – NimChimpsky

+2

@NimChimpsky I risultati sono solo in "insert order" se non ci sono join, dichiarazioni condizionali e nessuno ha scelto di riscrivere il motore di query SQL recentemente (ovvero questo comportamento è casuale e non garantito) –

5

Se c'è un id incremento automatico (chiave primaria) di quel tavolo, allora si può fare:

select top 10 * 
from mytable 
order by id desc 
+3

Anche se c'è un ID auto-incremento (chiave primaria) sulla tabella, non si può essere sicuri che la query darà gli ultimi 10 inseriti. Ad esempio, potrebbe essere stato fatto un inserimento che ha specificato un valore di -1 il campo identità con set identity_insert su – automatic

0

In MySQL è possibile utilizzare select * from table LIMIT 0,10

+2

Questa domanda è per SQL Server, non per MySQL ... – MatBailie

0

si può fare usando un trigger.

Salva i PK per la riga appena inserita in una tabella di controllo, insieme ad un indice crescente di qualche tipo (l'identità è probabilmente sufficiente). Elimina il più vecchio quando ci sono più di 10 righe.

Quindi unire la tabella di controllo alla tabella originale per ottenere le 10 righe complete.

1

https://stackoverflow.com/a/10636585/2858777

con fondo come (
selezionare superiore 4 * da tbl ordina per n desc ) select * da ordine inferiormente da n

Fonte dati:

| N | | ---- | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 |

Uscita:

| N | | ---- | | 7 | | 8 | | 9 | | 10 |

Problemi correlati