【问题标题】:MSSQL Select statement with incremental integer column... not from a table具有增量整数列的 MSSQL Select 语句...不是来自表
【发布时间】:2010-10-06 18:17:12
【问题描述】:

如果可能,我需要一个 t-sql 查询,它从任意表返回值,还返回一个增量整数列,第一行的 value = 1,第二行的 value = 2,依此类推。

此列实际上并不存在于任何表中,并且必须是严格递增的,因为 ORDER BY 子句可以对表的行进行排序,我希望递增的行始终保持完美的形状...

提前致谢。

--编辑 抱歉,忘了说,必须在 SQL Server 2000 上运行

【问题讨论】:

    标签: sql sql-server sql-server-2000 auto-increment row-number


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多