2009-10-11 26 views
13

Czy jest jakiś sposób wyboru, na przykład, pierwszych 10 wierszy tabeli w T-SQL (działający MSSQL)?
Myślę, że widziałem coś w Oracle zdefiniowane jako zmienna metryki rownum, używane w następujący sposób jak wybrać pierwsze N ​​wierszy z tabeli w T-SQL?

 
select * from Users where rownum<=10 
Ale co z MSSQL?

+1

Warto również zauważyć, że jeśli chcesz wziąć 10 najlepszych wyników w Oracle, musisz napisać wybierz * z (wybierz * z zamówienia użytkowników według nazwy użytkownika) gdzie rownum <= 10 Rownum oblicza się najpierw, przed złożeniem zamówienia. – LukLed

+0

@Lukled To samo jest prawdziwe, gdy używasz row_number() over() w mssql: http://stackoverflow.com/a/16610654/6910 – Jonathan

Odpowiedz

42
select top(@count) * from users 

Jeśli @count jest stałą, można upuścić nawiasy:

select top 42 * from users 

(te ostatnie prace nad SQL Server 2000 również, gdy były wymaga co najmniej 2005)

7
SELECT TOP 10 * 
FROM Users 

Należy zauważyć, że jeśli nie zostanie określona klauzula ORDER BY, to można zwrócić dowolne 10 wierszy, ponieważ "pierwsze 10 wierszy" tak naprawdę nie ma znaczenia, dopóki nie powiesz w bazie danych, jakie jest zamówienie posługiwać się.

+0

+1 dla rozróżnienia 'order by'. Zamówienie bez 'order by' jest * nigdy * gwarantowane przez SQL Server. – Eric

4

Można również użyć rowcount, ale TOP jest prawdopodobnie lepszy i czystszy, stąd upvote dla Mehrdad

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

SET ROWCOUNT 0 
+0

to jest sposób parametryzowania pierwszych N wierszy w wersjach SQL Server sprzed 2005 roku –

0

Spróbuj tego:

SELECT * FROM USERS LIMIT 10; 
+1

Pamiętaj, że to nie działa w MSSQL, ale działa w MySql. – Jonathan

7

Można użyć row_number Microsoftu() do zdecydować które wiersze powrócić. Oznacza to, że nie jesteś ograniczony tylko do najlepszych wyników X, możesz wziąć strony.

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 

Trzeba gniazdo pierwotne zapytanie jednak, bo inaczej dostaniesz komunikat o błędzie informujący, że nie można robić, co chcesz w sposób prawdopodobnie powinien być w stanie w idealnym świecie .

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

Spróbuj tego.

declare @topval int 

set @topval = 5 (customized value) 

SELECT TOP(@topval) * from your_database 
0

SELECT TOP 10 * FROM TABLE_NAME ORDER BY ORDERED_UNIQUE_COLUMN DESC

ORDERED_UNIQUE_COLUMN może być Twoja zwiększający klucz podstawowy lub timestamp

Powiązane problemy