2017-02-17 87 views
1

我有一个大表,需要在Teradata中为其添加行号。我在已经叫做row_num的表上有一列,但我需要用实际的数字来更新它。我试图使用下面的代码,但它不会工作。使用行号更新列

update database.time 
set row_num = INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY 
(START WITH 1 
INCREMENT BY 1 
MINVALUE 1 
NO CYCLE)) 

任何帮助,将不胜感激。谢谢!!

+0

有多大*一大桌*? – dnoeth

+0

该表为〜4b个记录 – Kristen

+0

为什么要为该表分配序列号? – dnoeth

回答

0

如果你有一个标识列,它唯一标识每一行,你可以这样做:

update t 
    set t.row_num = tt.seqnum 
    from database.time t, 
     (select t.*, row_number() over (order by id) as seqnum 
      from database.time t 
     ) tt 
    where t.id = tt.id; 
+0

这不是Teradata语法 –

0
update t 

from mytable t 
     ,(select  t.* 
        ,cast(row_number() over (order by id) as bigint) as rn 

     from  mytable t 
     ) tt 

set  row_num = tt.rn 

where t.id = tt.id 
; 
+0

P. - @ dnoeth将会建议,对于一张大桌子,您将使用CTAS而不是UPDATE,这是完全正确的。 –

+0

而当Kristen运行查询时,它将失败并显示数字溢出,因为ROW_NUMBER默认返回一个Int。但是,原始更新也会发生这种情况:-) – dnoeth

+0

@dnoeth - 不一定,取决于版本和配置:-)只是为了安全起见 - 我在答案中添加了CAST –