gpt4 book ai didi

sql - 如果有重复记录,则更新同一表的列

转载 作者:行者123 更新时间:2023-12-02 08:21:50 25 4
gpt4 key购买 nike

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

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

请不要尝试调用以上号码,它们仅用于测试目的!

最佳答案

可以使用解析函数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)

关于sql - 如果有重复记录,则更新同一表的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36541411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com