更新重复行oracle列

时间:2014-07-10 10:57:55

标签: sql oracle oracle10g

我在oracle中有一个包含3列的表:

create table pruebaBorrado (
 num1 varchar2(24), 
 num2 varchar2(24),
 num3 varchar2(24)); 

,表格包含:

insert into pruebaBorrado values ('1','1','1');
insert into pruebaBorrado values ('1','1','1'); 
insert into pruebaBorrado values ('1','1','1');
insert into pruebaBorrado values ('2','2','2');
insert into pruebaBorrado values ('2','2','2'); 
insert into pruebaBorrado values ('3','3','3'); 

如您所见,有重复的行。我想改变' num3'列仅用于重复的行并获得以下内容:

'1', '1', '1' 
'1', '1', '1A' 
'1', '1', '1B' 
'2', '2', '2' 
'2', '2', '2A' 
'3', '3', '3'

我该怎么做?在此先感谢!!

2 个答案:

答案 0 :(得分:0)

这有点蛮力,但确实有效:

update pruebaBorrado
    set num3 = (case (select count(*)
                      from pruebaBorrado pb
                      where pb.num1 = pruebaBorrado.num1 and pb.num2 = pruebaBorrado.num2 and
                            pb.rowid <= pruebaBorrado.rowid
                     )
                 when 1 then num3
                 when 2 then num3 || 'A'
                 when 3 then num3 || 'B'
                 when 4 then num3 || 'C'
                 else num3 || 'X'
                 end
                );

SQL小提琴是here

编辑:

以下内容也应该有效:

update pruebaBorrado
    set num3 = num3 ||
               substr(' ABCDEFGHIJKLMNOPQRSTUVWXYZ,
                      (select count(*)
                       from pruebaBorrado pb
                       where pb.num1 = pruebaBorrado.num1 and pb.num2 = pruebaBorrado.num2 and
                             pb.rowid <= pb.rowid
                      ), 1);

答案 1 :(得分:0)

这是有效的,经过测试。我在这里使用chr()将ascii值转换为char以获得A,B,C ..和秩函数。

update pruebaBorrado pb1
      set num3 = num3 || ( 
             select chr(temp.rank+63)  
            from ( select rowid, rank() over ( partition by num1,num2,num3     order by rowid ) rank 
                   from pruebaborrado pb2 ) temp
             where 
           temp.rowid = pb1.rowid
          and temp.rank >1
); 

逻辑如下:

  1. 排名功能会对每个重复行进行排名,如下所示:

    <强> NUM1 | NUM2 | NUM3 |秩
     1 | 1 | 1 | 1
     1 | 1 | 1 | 2
     1 | 1 | 1 | 3个

  2. 此等级用于通过向其添加63来为A,B,C生成ASCII。使用63是因为我们需要为第一个副本附加A,其等级为2,A的ASCII值为65.

相关问题