使用递增整数列的MSSQL Select语句...不是来自表格

53

如果可能的话,我需要一个T-SQL查询,该查询不仅可以返回任意表中的值,还可以返回一个增量整数列,其中第一行的值为1,第二行为2,依此类推。

这个列实际上并不存在于任何表中,并且必须是严格递增的,因为ORDER BY子句可能会对表的行进行排序,我希望递增行始终保持完好无损。

该解决方案必须在SQL Server 2000上运行。

4个回答

83

适用于SQL 2005及以上版本

SELECT ROW_NUMBER() OVER( ORDER BY SomeColumn ) AS 'rownumber',*
    FROM YourTable

要达到2000,你需要像这样做

SELECT IDENTITY(INT, 1,1) AS Rank ,VALUE
INTO #Ranks FROM YourTable WHERE 1=0

INSERT INTO #Ranks
SELECT SomeColumn  FROM YourTable
ORDER BY SomeColumn 

SELECT * FROM #Ranks
Order By Ranks

在这里也可以看到 Row Number


4
别忘了删除临时表。 - Joel Coehoorn

12

您可以从自定义数字开始递增,例如,如果您想为每次付款添加支票号码,则可以执行以下操作:

select @StartChequeNumber = 3446;
SELECT 
((ROW_NUMBER() OVER(ORDER BY AnyColumn)) + @StartChequeNumber ) AS 'ChequeNumber'
,* FROM YourTable

会为每一行给出正确的支票号码。


6

1
抱歉,我忘了提到,必须在 SQL 2000 上运行。 - Rodrigo

0

这段代码虽然丑陋且性能不佳,但从技术上讲,它适用于至少有一个唯一字段的任何表,并且在SQL 2000中也能正常工作。

SELECT (SELECT COUNT(*) FROM myTable T1 WHERE T1.UniqueField<=T2.UniqueField) as RowNum, T2.OtherField
FROM myTable T2
ORDER By T2.UniqueField

注意:如果您使用此方法并将WHERE子句添加到外部SELECT中,则如果要使数字连续,还必须将其添加到内部SELECT中。

这个方法可以行得通,但正如你已经提到的,对于每一行数据它都需要扫描整张表格,这也被称为运行计数。 - SQLMenace
是的,这绝对是一个非常糟糕的解决方案。然而,在 SQL2K 的限制下,只能选择这个或者使用临时表(另一个答案已经给出)。我想这取决于具体情况哪个方案更好一些。 - JohnFx
场景是:从表中选择几千行。 :_( - Rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接