如果存在重复记录,请更新同一表的列



如果表中的行重复,我需要更新一列。

这里的场景类似于如果有3行重复,那么我们必须将两行标记为错误,将一行标记为成功。

伪数据可能类似

create table test_dup (acc_num number, tel_num number, imsi number, done varchar2(20));
insert into test_dup values (43532111, 9874554422, 58944235, null);
insert into test_dup values (43532111, 9874554422, 58944235, null);
insert into test_dup values (43532111, 9874554422, 58944235, null);
insert into test_dup values (43532333, 9845781554, 265454522, null);
insert into test_dup values (623352777, 9928123457, 89455422, null);
insert into test_dup values (623352777, 9928123457, 89455422, null);
select acc_num, tel_num, imsi 
  from test_dup  
group by acc_num, tel_num, imsi having count(acc_num) > 1;

此查询提供重复的行但这里的问题是,我需要将acc_num 43532111的2行的DONE列更新为"error",将1行更新为"success",因此,如果我使用更新语句,如。。。

update test_dup
  set done = 'error'
where (acc_num,tel_num, imsi) in (select acc_num, tel_num, imsi
                                 from test_dup
                            group by acc_num, tel_num, imsi
                            having count(acc_num) > 1);

然后它更新5行,即除非重复外的所有重复行。

但在我们的情况下,它应该只将3行2个重复的acc_num=43532111和1个重复的acc_num=623352777作为"错误"

真正的表大约有35列,所以有没有什么方法可以让我们不需要为group-by-clause编写每个列名?

我正在使用---

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0-64位生产版

请不要试图拨打以上号码,它们只是为了测试目的!

您可以使用分析函数row_number()和rowid来获取行:

UPDATE test_dup
   SET done = 'error'
 WHERE ROWID IN (SELECT ROWID
                   FROM (SELECT acc_num, tel_num, imsi, ROW_NUMBER () OVER (PARTITION BY acc_num, tel_num, imsi ORDER BY acc_num) AS ROW_NUMBER FROM test_dup)
                  WHERE ROW_NUMBER > 1)

相关内容

  • 没有找到相关文章

最新更新