【发布时间】:2016-04-11 06:34:30
【问题描述】:
如果表中的行重复,我需要更新列。
这里的场景是如果有 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;
这个查询给出了重复的行 但这里的问题是,我需要将 2 行 acc_num 43532111 的 DONE 列更新为“错误”,将 1 行更新为“成功”,因此如果我使用类似 ...
的更新语句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子句写下每一列的名称?
我正在使用---
Oracle Database 12c 企业版版本 12.1.0.2.0 - 64 位生产
请不要尝试拨打以上号码,它们仅用于测试目的!
【问题讨论】:
-
最简单的解决方案是实现主键以防止插入重复行。我不知道 Oracle 是否支持在所有 35 列上使用 ROW_NUMBER 从 cte 进行 UPDATE...