具有增量整数列的 MSSQL Select 语句...不是来自表
Posted
技术标签:
【中文标题】具有增量整数列的 MSSQL Select 语句...不是来自表【英文标题】:MSSQL Select statement with incremental integer column... not from a table 【发布时间】:2010-10-06 18:17:12 【问题描述】:如果可能,我需要一个 t-sql 查询,它从任意表返回值,还返回一个增量整数列,第一行的 value = 1,第二行的 value = 2,依此类推。
此列实际上并不存在于任何表中,并且必须是严格递增的,因为 ORDER BY 子句可以对表的行进行排序,我希望递增的行始终保持完美的形状...
提前致谢。
--编辑 抱歉,忘了说,必须在 SQL Server 2000 上运行
【问题讨论】:
【参考方案1】:您可以从自定义编号开始并从那里递增,例如,您想为可以执行的每笔付款添加一个支票编号:
select @StartChequeNumber = 3446;
SELECT
((ROW_NUMBER() OVER(ORDER BY AnyColumn)) + @StartChequeNumber ) AS 'ChequeNumber'
,* FROM YourTable
将为每一行提供正确的支票号码。
【讨论】:
【参考方案2】:它很丑而且性能很差,但从技术上讲,这适用于任何具有至少一个唯一字段的表,并且适用于 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。
【讨论】:
这会起作用,但就像你已经提到的每一行它必须扫描整个表,这也称为运行计数 是的,这是一个非常糟糕的解决方案。但是,在 SQL2K 的约束下,它要么是这个,要么是临时表(已经在另一个答案中提供)。我想这取决于确切的场景,哪种解决方案的危害较小。 场景是:从一个表中选择几千行:_(【参考方案3】:对于 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】:试试 ROW_NUMBER()
http://msdn.microsoft.com/en-us/library/ms186734.aspx
例子:
SELECT
col1,
col2,
ROW_NUMBER() OVER (ORDER BY col1) AS rownum
FROM tbl
【讨论】:
对不起,我忘了说,必须运行 SQL 2000以上是关于具有增量整数列的 MSSQL Select 语句...不是来自表的主要内容,如果未能解决你的问题,请参考以下文章