具有增量整数列的 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 语句...不是来自表的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 迁移中创建一个具有自定义大小的小整数列

手工MSSQL注入常用SQL语句

MSSql - 选择语句不适用于所有列

MySQL 仅从 SELECT 创建具有自动增量的临时表

关于MSSQL用户高置的问题

整数列可以为空吗?