2009-10-11 54 views
13

Esiste un modo per selezionare, ad esempio, le prime 10 righe di una tabella in T-SQL (lavoro MSSQL)?
Penso di aver visto qualcosa in Oracle definito come meta variabile Rownum, utilizzato in un modo seguente: come selezionare le prime N righe da una tabella in T-SQL?

 
select * from Users where rownum<=10 
Ma che dire di MSSQL?

+1

Vale anche la pena notare che se vuoi ottenere i primi 10 risultati in Oracle, devi scrivere selezionare * da (selezionare * da Ordine utenti per Nome utente) dove rownum <= 10 Rownum viene calcolato per primo, prima di ordinare per. – LukLed

+0

@Lukled Lo stesso vale quando si utilizza row_number() over() in mssql: http://stackoverflow.com/a/16610654/6910 – Jonathan

risposta

42
select top(@count) * from users 

Se @count è una costante, è possibile eliminare le parentesi:

select top 42 * from users 

(queste ultime opere in SQL Server 2000 troppo, mentre il primo richiede almeno 2005)

7
SELECT TOP 10 * 
FROM Users 

Si noti che se non si specifica una clausola ORDER BY, è possibile restituire 10 righe, perché "prime 10 righe" non significa nulla finché non si specifica al database quale ordine effettuare uso.

+0

+1 per la distinzione "ordine per". L'ordine senza un 'order by' è * mai * garantito da SQL Server. – Eric

4

è anche possibile utilizzare conteggio delle righe, ma superiore è probabilmente migliore e più pulito, da cui l'upvote per Mehrdad

SET ROWCOUNT 10 
SELECT * FROM dbo.Orders 
WHERE EmployeeID = 5 
ORDER BY OrderDate 

SET ROWCOUNT 0 
+0

questo è un modo per parametrizzare le prime N righe nelle versioni di SQL Server pre-2005 –

0

Prova questo:

SELECT * FROM USERS LIMIT 10; 
+1

Ricordare che questo non funziona in MSSQL, ma funziona in MySql. – Jonathan

7

È possibile utilizzare row_number di Microsoft() per decidere quali file da restituire. Ciò significa che non sei limitato solo ai primi risultati X, puoi prendere le pagine.

SELECT * 
FROM (SELECT row_number() over (order by UserID) AS line_no, * 
     FROM dbo.User) as users 
WHERE users.line_no < 10 
OR users.line_no BETWEEN 34 and 67 

Devi nido query originale, però, perché altrimenti si otterrà un messaggio di errore che indica che non si può fare ciò che si desidera in modo probabilmente si dovrebbe essere in grado di in un mondo ideale .

Msg 4108, Level 15, State 1, Line 3 
Windowed functions can only appear in the SELECT or ORDER BY clauses. 
1

Prova questo.

declare @topval int 

set @topval = 5 (customized value) 

SELECT TOP(@topval) * from your_database 
0

SELEZIONE TOP 10 * FROM TABLE_NAME ORDER BY ORDERED_UNIQUE_COLUMN DECR

ORDERED_UNIQUE_COLUMN potrebbe essere il tuo incrementando chiave primaria o un timestamp

Problemi correlati