【问题标题】:Update Oracle table column with a sequence number based on varchar field in same table使用基于同一表中的 varchar 字段的序列号更新 Oracle 表列
【发布时间】:2020-01-01 22:37:36
【问题描述】:

我需要语法方面的帮助,以根据另一个字段 VARCHAR2 的顺序使用新的数字序列更新 oracle 表中的现有字段。

当前表:

CODE    CODE_ORDER
A00     3
A00.0   4
A00.1   6
A00.9   8

期望的结果:

CODE    CODE_ORDER
A00     1
A00.0   2
A00.1   3
A00.9   4

这里的 SELECT 语句给了我想要的结果,但是当我将它与 UPDATE 语句一起使用时,我收到一个错误。

UPDATE Table SET code_order = (select row_number() over (order by 
code asc) from Table)

UPDATE 语句显示此错误:

ORA-01427: single-row subquery returns more than one row

提前感谢您的任何建议。

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案1】:

    你可以使用with..as子句

    update tab t
       set code_order = ( with tb as ( 
                          select t.*,row_number() over (order by code) as rn from tab t
                        )  
                        select rn
                          from tb
                         where tb.code=t.code)
    

    考虑到code 列的值是唯一的

    Demo

    【讨论】:

      【解决方案2】:

      您需要在 SET 子句中使用子查询,如下所示:

      UPDATE Table t SET t.code_order = (
      Select tin1.rn from
      (select row_number() over (order by tin.code asc) rn, tin.code from Table tin) tin1
      Where t.code = tin1.code)
      

      注意:thks查询将适用于代码列中不存在重复值的样本数据。

      干杯!!

      【讨论】:

        【解决方案3】:

        你可以这样做:

        merge
        into table
        using (
          select code,row_number() over (order by code asc) as new_code_order from table
        ) new_table
        on (table.code = new_table.code)
        when matched then update set
          table.code_order = new_table.new_code_order
        

        我认为这也适用于这种简单的情况:

        update (select * from table order by code) set code_order = rownum;
        

        【讨论】:

        • MERGE 就像一个魅力。非常非常感谢!!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 2016-04-11
        • 1970-01-01
        相关资源
        最近更新 更多