Sql 如何使用Teradata中的行号()更新列?

Sql 如何使用Teradata中的行号()更新列?,sql,teradata,window-functions,Sql,Teradata,Window Functions,我有一张这样的桌子 Create table test1(emp_id decimal(5,0), emp_name varchar(20)); Insert into test1(2015,'XYZ'); Insert into test1(2016,'XYZ2'); 现在我想将emp_id更新为row_number() 或 将新列添加到同一个表中,如(emp\u no integer)添加到行号() 有人能告诉我这方面的查询吗?您需要使用“更新自”: UPDATE test1 FROM

我有一张这样的桌子

Create table test1(emp_id decimal(5,0), emp_name varchar(20));

Insert into test1(2015,'XYZ');
Insert into test1(2016,'XYZ2');
现在我想将emp_id更新为row_number() 或 将新列添加到同一个表中,如(emp\u no integer)添加到行号()


有人能告诉我这方面的查询吗?

您需要使用“更新自”:

UPDATE test1
FROM
 ( SELECT ROW_NUMBER() OVER (ORDER BY emp_id) AS rn,
     emp_id 
   FROM test1
 ) AS src
SET emp_id = src.rn
WHERE test1.emp_id = src.emp_id -- must be unique column(s)

顺便说一句,与其更新表中的所有行,不如插入/选择或将选择合并到新表中。如果没有唯一列,则必须执行此操作。如果
emp\u id
是表的PI(否则性能将非常糟糕),则应执行此操作。

非常感谢您的回复。我还有一个疑问,如果同一列emp_id的值为'null'或所有行(如1)的值相同,那么查询是什么?你能告诉我吗?@Vivekhrry:如果有重复的行,就无法更新,你需要一个新表加上Insert/Select。对于单个NULL,您可以添加
其中test1.emp_id=src.emp_id或(test1.emp_id为NULL,src.emp_id为NULL)
您能告诉我,如何将非唯一列更新为标识值,如(1,2,3…)@vivekhrry:正如我已经写的,如果没有唯一的列组合,就无法更新,您需要创建一个新表并插入/选择行号查询。顺便说一句,身份插入不保证是连续的。再次感谢。我可以将标识列添加到现有表中,但该表没有任何唯一索引或主键吗?非常感谢,但我想将非唯一列更新为标识值,如(1,2,3,…)我认为标识不允许非唯一值。标识本身既可以是可更新的(默认为子句),也可以是自动生成的(总是子句)?谁能告诉我吗?
Create table test1(
  emp_id decimal(5,0), 
  emp_name varchar(20),
  emp_no INTEGER GENERATED ALWAYS AS IDENTITY
         (START WITH 1
          INCREMENT BY 1
         )
);

Insert into test1(2015,'XYZ1',2);
Insert into test1(2016,'XYZ2',2);      
Insert into test1(2015,'XYZ3',null);
Insert into test1(2016,'XYZ4',null);