假設我有一條SELECT語句返回一些結果集合。有沒有一些方法,我可以我的編號通過以下方式結果:SQL:對SELECT語句返回的行進行編號
SELECT TOP 3的名字從PuppyNames ORDER BY NumberOfVotes
會給我...
菲
路虎
弗雷迪克魯格
...但我想...
1,菲多
2,路虎
3,弗雷迪克魯格
這裏當然逗號表示這些數字在他們自己的專欄中。 [我正在使用SQL Server 2000.]
假設我有一條SELECT語句返回一些結果集合。有沒有一些方法,我可以我的編號通過以下方式結果:SQL:對SELECT語句返回的行進行編號
SELECT TOP 3的名字從PuppyNames ORDER BY NumberOfVotes
會給我...
菲
路虎
弗雷迪克魯格
...但我想...
1,菲多
2,路虎
3,弗雷迪克魯格
這裏當然逗號表示這些數字在他們自己的專欄中。 [我正在使用SQL Server 2000.]
在Microsoft SQL Server 2005中,您有ROW_NUMBER()
函數,它正是您想要的。
如果您遇到SQL Server 2000,典型的技術是創建一個新的臨時表以包含查詢結果,並添加一個IDENTITY
列並生成增量值。請參閱以下有關此技術的文章:http://www.databasejournal.com/features/mssql/article.php/3572301/RowNumber-function-in-SQL-Server-2005.htm
在客戶端應用程序中添加數字通常更容易。 SQL中有技巧,但對純粹主義者來說,他們涉及作弊,而且他們通常不是可移植的。
對我來說,這是我最基本的重構模式之一。
SQL 2005,2008:
SELECT TOP 3 ROW_NUMBER()OVER(ORDER BY NumberOfVotes DESC)AS VoteRank,名稱 FROM PuppyNames
編輯:對不起 - 只是看到你指定的2000
哇,2000年沒有解析函數? – 2008-11-11 22:26:51
直到2003年,我認爲分析函數甚至不是ANSI標準的一部分。 – quillbreaker 2013-11-15 15:31:10
對於SQL 2000,您需要使用相關的子查詢。
SELECT (
SELECT COUNT(*)
FROM PuppyNames b
WHERE b.Popularity <= a.Popularity
) AS Ranking
, a.Name
FROM PuppyNames a
ORDER BY a.Popularity
你也可以用一個臨時表做到這一點:
SELECT TOP 3 Name FROM PuppyNames ORDER BY NumberOfVotes DESC
成爲
CREATE TABLE #RowNumberTable (
RowNumber int IDENTITY (1,1),
PuppyName varchar(MAX)
)
INSERT #RowNumberTable (PuppyName)
SELECT TOP 3 Name FROM PuppyNames ORDER BY NumberOfVotes DESC
SELECT * from #RowNumberTable ORDER BY RowNumber
DROP TABLE #RowNumberTable
如果你會發現,你的SELECT語句是在那裏。它只是包圍着讓行號工作的東西。
您可以使用此查詢,其中考慮到了PK,以在同一NumberOfVotes的情況下,提供正確的編號:
SELECT TOP 3 COUNT(*) AS Number, p1.Name
FROM PuppyNames AS p1 INNER JOIN PuppyNames AS p2
ON p1.NumberOfVotes < p2.NumberOfVotes OR (p1.NumberOfVotes = p2.NumberOfVotes AND p1.ID >= p2.ID)
GROUP BY p1.Name
ORDER BY Number
你的ORDER BY子句中很可能使用DESC修飾符。 – BoltBait 2008-11-11 22:38:09