【问题标题】:How to UPDATE column with ROW_NUMBER() in Teradata?如何在 Teradata 中使用 ROW_NUMBER() 更新列?
【发布时间】:2016-05-19 06:37:13
【问题描述】:

我有一张这样的桌子

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_no integer) 到 row_number()。

谁能告诉我这个查询?

【问题讨论】:

    标签: sql teradata window-functions


    【解决方案1】:

    您需要使用 UPDATE FROM:

    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_id 是您的表的 PI,您应该这样做(否则性能会很糟糕)。

    【讨论】:

    • 非常感谢您的回复。我还有一个疑问,如果我有相同的列 emp_id 具有“空”值或所有行(如 1)的值相同,那么查询是什么?你能告诉我吗?
    • @VivekHarry:如果有重复的行无法更新,您需要一个新表加上插入/选择。对于单个 NULL,您可以添加 WHERE test1.emp_id = src.emp_id or (test1.emp_id is null and src.emp_id is null)
    • 您能告诉我,如何将非唯一列更新为 IDENTITY VALUE,例如 (1,2,3,...)
    • @VivekHarry:正如我已经写过的,如果没有唯一的列组合,则无法更新,您需要创建一个新表并插入/选择 ROW_NUMBER 查询。顺便说一句,不保证 IDENTITY 插入是连续的。
    • 再次感谢。我可以将 IDENTITY COLUMN 添加到现有表中,但该表没有任何唯一索引或主键吗?
    【解决方案2】:
    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);      
    

    【讨论】:

    • 非常感谢,但我想将一个非唯一列更新为 IDENTITY 值,例如 (1,2,3,..)
    • 我不相信身份允许非唯一值。身份本身可以是可更新的(默认子句)或自动生成的(always 子句)。
    • 实际上在 Teradata 中我可以将标识列添加到现有表中,我该如何实现?谁能告诉我?
    猜你喜欢
    • 2014-01-03
    • 2017-04-16
    • 2015-08-10
    • 2023-04-11
    • 2020-04-23
    • 2021-12-14
    • 2023-03-10
    • 2013-05-26
    相关资源
    最近更新 更多