首页 > 解决方案 > 从 Oracle 数据库中的子查询中删除结果

问题描述

我搞砸了一个数据库表,现在里面有多个重复项。现在我想删除所有重复项。我通过以下查询找到了它们:

select order_uuid, changed_at, count(*)
from mobisl_1.t_order_states
group by order_uuid, changed_at
having count (*) > 1;

重复项由“order_uuid”和“changed_at”列定义。如果两者的组合在表中出现多次,则将其定义为重复。

我得到一个 904 行的结果集。结果集如我所料。现在我想删除那些重复的

delete from mobisl_1.t_order_states
where ORDER_UUID in (
    select order_uuid, changed_at, count(*)
    from mobisl_1.t_order_states
    group by order_uuid, changed_at
    having count (*) > 1
);

然后 Oracle 显示错误 ORA-00913:值太多。我可以在这里做什么?我已经尝试使用某些条件(仅获取日期低于 x 的行)来限制结果集的大小,但没有得到肯定的结果。

标签: sqloracleoracle11g

解决方案


您的问题的答案是使用元组并count(*)从以下内容中删除select

delete
    from mobisl_1.t_order_states
where (ORDER_UUID, changed_at) in
         (select order_uuid, changed_at
          from mobisl_1.t_order_states
          group by order_uuid, changed_at
          having count(*) > 1
         );

这回答了您提出的问题。但是,我认为这不是您真正想要做的。通常,我想保留其中一行重复的行。

如果您想保留其中一行,那么要么做一些研究,要么问另一个问题。


推荐阅读