当前位置: 首页 > 面试题库 >

SQL:将具有增量ID的列添加到SELECT

夹谷岳
2023-03-14
问题内容

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

SELECT name FROM people;

people表没有唯一ID列。我想添加到查询结果列id增量int从0或1开始(这并不重要)。一个人怎么能做到这一点?(PostgreSQL数据库)


问题答案:

用途ROW_NUMBER()

SQLFiddle

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

编辑:

ORDER BY 1vs之间的区别ORDER 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;


 类似资料:
  • 我有一个现有的dataframe,我需要在其中添加一个额外的列,该列的每一行都包含相同的值。 现有df: 新df: 我知道如何附加现有的series/dataframe列。但这是另一种情况,因为我只需要添加“Name”列,并将每一行设置为相同的值,在本例中为“abc”。

  • 问题内容: 我需要创建一个基本上只保留索引列表的表。因此,我创建了一个表,其中只有一个自动递增的列,称为“ id”。但是,我似乎无法向该表隐式添加自动递增的值。 我知道通常在表中有这样一列(不仅有此列)时,您可以执行以下操作: 插入表(col1,col2 …)值(val1,val2 …) 而且,如果您不指定自动递增的列,它将自动获取一个值。但是,类似: 插入表()值()插入表插入表() 等等。所有

  • 如果我在 SQL Server 2008 中使用以下 SQL 命令来更新具有外键约束的表: 是表中我的FK列。我正在尝试引用我的表中的。我收到这个错误: 外键“UserID”引用引用表“员工”中的无效列“UserID”。

  • 问题内容: 如何在SQL Server 2000 / SQL Server 2005中的现有表中添加具有默认值的列? 问题答案: 句法: 例子: 笔记: 可选的约束名称: 如果省略,将自动生成 一个带有有趣名称的 如果您的,则 无论您是否指定,它都会自动对所有现有记录使用默认值WITH VALUES。 插入如何与默认约束一起使用: 如果将记录插入到SomeTable并且不指定SomeCol的值,则

  • 我的html文件生成一个表: 如何在每次生成新行时将id分配给第一个td?

  • 问题内容: 从: http://docs.python.org/py3k/library/datetime.html#timedelta- objects timedelta对象代表持续时间,即两个日期或时间之间的差。 那么,为什么我会出错: 问题答案: 对象不支持除了用秒。 虽然有一个自然的定义,时钟算术。您可以这样计算: 将datetime.time提升到一个对象,然后添加增量,然后将结果回落