如果有重复记录则更新相同table的一列

Update a column of same table if there is duplicate records

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

这里的场景就像如果有 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;

这个查询给出了重复的行 但这里的问题是我需要将 DONE 列更新为 'error' 2 行 acc_num 43532111 和 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 作为 'error'

真正的table大概有35列,那有什么办法可以让group by子句不用写每一列的名字?

我正在使用---

Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产

请不要尝试拨打以上号码,它们仅供测试!

您可以使用分析函数row_number() and 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)