【问题标题】:SQL: Add column with incremental id to SELECTSQL:将具有增量 id 的列添加到 SELECT
【发布时间】:2015-12-08 22:59:02
【问题描述】:

我有一个简单的查询,例如:

SELECT name FROM people;

people 表没有唯一的 id 列。我想在查询结果中添加一列 id,增量 int 从 0 或 1 开始(没关系)。怎么能做到这一点? (postgresql 数据库)

【问题讨论】:

  • ROW_NUMBER() OVER(...) 如果是 SQL Server
  • @lad2025 实际上是 postgresql
  • @lad2025: 窗口函数对 SQL Server 来说没什么特别的。

标签: sql postgresql select


【解决方案1】:

如果只在查询运行时需要,可以使用row_number

select row_number() over(order by name) as id, name
from people

【讨论】:

    【解决方案2】:

    row_number 窗口函数应该符合要求:

    SELECT ROW_NUMBER() OVER (ORDER BY 1), *
    FROM   people
    

    【讨论】:

      【解决方案3】:

      使用ROW_NUMBER():

      SQLFiddle

      SELECT 
        name,
        ROW_NUMBER() OVER (ORDER BY name) AS id
      FROM people;
      

      编辑:

      ORDER BY 1ORDER BY column_name 之间的区别

      SQLFiddleDemo

      SELECT 
          name,
          ROW_NUMBER() OVER (ORDER BY name) AS id
      FROM people;
      
      /* Execution Plan */
      QUERY PLAN WindowAgg (cost=83.37..104.37 rows=1200 width=38)
      -> Sort (cost=83.37..86.37 rows=1200 width=38)
      **Sort Key: name**
      -> Seq Scan on people (cost=0.00..22.00 rows=1200 width=38)
      
      SELECT 
          name,
          ROW_NUMBER() OVER (ORDER BY 1) AS id
      FROM people;
      
      /* Execution Plan */
      QUERY PLAN WindowAgg (cost=0.00..37.00 rows=1200 width=38)
      -> Seq Scan on people (cost=0.00..22.00 rows=1200 width=38)
      

      第二种情况没有排序操作。

      你也可以将第二个查询写成:

      SELECT 
          name,
          ROW_NUMBER() OVER () AS id
      FROM people;
      

      为什么人们在窗口函数中写ORDER BY 1

      因为在某些方言中它是必需的,ORDER BY 1 就像占位符一样。

      甲骨文:

      ORA-30485:窗口规范中缺少 ORDER BY 表达式

      SELECT 
        name,
        ROW_NUMBER() OVER (ORDER BY 1) AS id
      FROM people;
      

      TSQL:

      函数“ROW_NUMBER”必须有一个带有 ORDER BY 的 OVER 子句。

      SELECT 
          name,
          ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS id
      FROM people;
      

      【讨论】:

      • ORDER BY 1 和列名有什么区别?
      【解决方案4】:
      猜你喜欢
      • 2016-07-23
      • 2020-09-05
      • 2013-01-23
      • 2022-12-13
      • 2017-04-08
      • 2016-11-17
      • 2022-10-05
      相关资源
      最近更新 更多