2009-10-11 46 views
13

有什麼方法可以選擇,例如,T-SQL(工作MSSQL)中的表的前10行?
我想我在Oracle中看到了一些被定義爲rownum meta變量的東西,用於以下方式 如何從T-SQL中的表中選擇前N行?

 
select * from Users where rownum<=10 
但是MSSQL呢?

+1

這也是值得關注如果你想在Oracle中取得前10名的成績,你必須寫 select * from(select * from User order by UserName)其中rownum <= 10 Rownum是在排序前先計算的。 – LukLed 2009-10-11 23:57:46

+0

@Lukled當您在mssql中使用row_number()over()時也是如此:http://stackoverflow.com/a/16610654/6910 – Jonathan 2013-05-20 09:36:38

回答

42
select top(@count) * from users 

如果@count是一個常數,你可以刪除括號:

select top 42 * from users 

(SQL Server 2000中也對後者的作品,而前者至少需要2005)

7
SELECT TOP 10 * 
FROM Users 

請注意,如果您沒有指定ORDER BY子句,則可能會返回任何10行,因爲「前10行」並不真正表示任何內容,除非您告訴數據庫什麼命令使用。

+0

對於'order by'區分+1。沒有'order by'的順序*從未*由SQL Server保證。 – Eric 2009-10-11 23:06:43

4

您還可以使用的行數,但TOP可能是更好的和更清潔,因此給予好評的邁赫達德

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

SET ROWCOUNT 0 
+0

這是一種參數化SQL Server 2005之前版本中前N行的方法 – 2009-10-11 23:11:59

0

試試這個:

SELECT * FROM USERS LIMIT 10; 
+1

請記住,這在MSSQL中不起作用,但它在MySql中起作用。 – Jonathan 2013-05-17 13:56:26

7

您可以使用微軟的ROW_NUMBER()函數來決定哪些行要返回。這意味着你不僅僅侷限於最高X的結果,你可以採取頁面。

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 

你必須巢原始查詢,但因爲否則你會得到一個錯誤信息,告訴你,你不能在路上做你想要什麼,你應該能夠在一個理想的世界。

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

試試這個。

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可能是你的遞增的主鍵或時間戳