【问题标题】:SQL to output line number in results of a querySQL 在查询结果中输出行号
【发布时间】:2009-08-18 11:54:37
【问题描述】:

我想为 sql 查询结果中的每一行生成一个行号。这怎么可能?

示例:在请求中

select distinct client_name from deliveries

我想添加一列显示行号

我正在使用 sql server 2005。

【问题讨论】:

  • 你使用的是什么 SQL 引擎?
  • 您使用的是什么数据库平台? MySQL? SQL 服务器?甲骨文?您从什么编程语言/环境运行查询?您认为通过查询而不是通过程序代码来执行此操作有什么特别的原因吗?
  • 我使用 microsoft 报告服务作为环境,由于此工具中的错误,我需要为我的行提供一个整数标识符。
  • 这个行号有什么用?如果您重新运行查询,则它可以更改。在客户端添加 IDENTITY 列不是更好吗?
  • @Russ Cam - 所以你的解决方案是没有人应该打印任何报告,永远?

标签: sql sql-server sql-server-2005


【解决方案1】:

这取决于您使用的数据库。适用于 SQL Server、Oracle 和 MySQL 的一种选择:

SELECT ROW_NUMBER() OVER (ORDER BY SomeField) AS Row, *
FROM SomeTable

更改 SomeField 和 SomeTable 是根据您的特定表和相关字段来排序。 SomeField 在查询的上下文中自然是唯一的。

在您的情况下,查询如下(Faiz 首先制作了这样一个查询):

SELECT ROW_NUMBER() OVER (ORDER BY client_name) AS row_number, client_name
FROM (SELECT DISTINCT client_name FROM deliveries) TempTable

我认为它不适用于 SQLite(如果有人可以在这里纠正我,我将不胜感激),我不确定那里有什么替代方案。

【讨论】:

  • 对于 sql server 2005,这将是首选选项
  • @Russ:你的意思是唯一理智的选择。
  • @Eric:你是在暗示理智总是首选吗? :)
  • @Rax:仅在 SQL 中。除此之外,理智总是次要的选择。
【解决方案2】:

您可以为此使用 ROW_NUMBER 函数。在此处检查语法http://msdn.microsoft.com/en-us/library/ms186734.aspx

SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY FirstName) AS 'Row#'    
FROM Sales.vSalesPerson;

对于您的查询,

SELECT client_name, ROW_NUMBER() Over (Order By client_name) AS row_number 
FROM   (select distinct client_name from deliveries) SQ

会起作用的。

【讨论】:

    【解决方案3】:

    在甲骨文中

    SQL> select row_number() over (order by deptno) as rn
      2         , deptno
      3  from
      4     ( select distinct deptno
      5            from emp
      6          )
      7  /
    
            RN     DEPTNO
    ---------- ----------
             1         10
             2         20
             3         30
    
    SQL>
    

    【讨论】:

      【解决方案4】:

      在 SQL 中我们也使用这个查询:

      select row_number() over (order by table_kid) as S_No ,table_columnname,table_columnname2 from tablename where table_fieldcondition='condtionnal falg or data ';
      

      这里是table_kid,也可能是其他table_columnname

      【讨论】:

        【解决方案5】:

        或者你也可以这样做

        SELECT DISTINCT client_name, @num := @num + 1 AS lineNum(this is your new col)
        FROM deliveries
        JOIN (SELECT @num :=0) AS n ON 1=1;
        

        希望这也有帮助:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-12
          • 2017-09-09
          相关资源
          最近更新 更多