Sql 删除副本并保留一份副本

Sql 删除副本并保留一份副本,sql,oracle,sql-delete,Sql,Oracle,Sql Delete,我一直在讨论如何从表中删除重复项并保留一个副本。我看到了一个示例,其中一个示例有一个带有复合键的表。有人有这个想法吗 表CONT(带复合键checkno、薪资月、薪资年) delete (select * from CONTR t1 INNER JOIN (select CHECKNO, SALARY_YEAR,SALARY_MONTH FROM CONTR group by CHECKNO, SALARY_YEAR,SALARY_MONTH HAVING COUNT(*) >

我一直在讨论如何从表中删除重复项并保留一个副本。我看到了一个示例,其中一个示例有一个带有复合键的表。有人有这个想法吗

表CONT(带复合键checkno、薪资月、薪资年)

delete (select * from CONTR t1
    INNER JOIN
 (select CHECKNO, SALARY_YEAR,SALARY_MONTH FROM CONTR 
group by CHECKNO, SALARY_YEAR,SALARY_MONTH HAVING COUNT(*) > 1) dupes 
ON 
t1.CHECKNO = dupes.CHECKNO AND
t1.SALARY_YEAR= dupes.SALARY_YEAR AND
t1.SALARY_MONTH=dupes.SALARY_MONTH);

我希望删除一个副本并保留一个。

另一种方法是,假设您有包含您提到的3列的副本

创建具有不同值的临时表 放下你的桌子 重命名临时表 特别是如果您处理大量数据,这种方式将比删除快得多

如果您正在处理的dup数据是主表的子集,则步骤如下

创建具有不同值的临时表 从主表中删除所有dup列 将数据从临时表插入主表 第一步的SQL是

create table tmp_CONTR AS 
select distinct CHECKNO, SALARY_YEAR,SALARY_MONTH   -- this part can be modified to match your needs 
  from CONTR t1;

另一种实现这一点的方法是假设您有3列的副本,您已经提到

创建具有不同值的临时表 放下你的桌子 重命名临时表 特别是如果您处理大量数据,这种方式将比删除快得多

如果您正在处理的dup数据是主表的子集,则步骤如下

创建具有不同值的临时表 从主表中删除所有dup列 将数据从临时表插入主表 第一步的SQL是

create table tmp_CONTR AS 
select distinct CHECKNO, SALARY_YEAR,SALARY_MONTH   -- this part can be modified to match your needs 
  from CONTR t1;

您可以使用下面的查询,通过将rowid用作具有唯一值列来删除重复项:

delete contr t1
 where rowid <
     (
      select max(rowid)
        from contr t2
       where t2.checkno = t1.checkno
         and t2.salary_year = t1.salary_year
         and t2.salary_month = t1.salary_month
      );

您可以使用下面的查询,通过将rowid用作具有唯一值列来删除重复项:

delete contr t1
 where rowid <
     (
      select max(rowid)
        from contr t2
       where t2.checkno = t1.checkno
         and t2.salary_year = t1.salary_year
         and t2.salary_month = t1.salary_month
      );

其中一个副本被保留的逻辑是什么?这个SQL对您有用吗?你收到错误消息了吗?问题是什么?是什么逻辑使其中一个副本得以保留?这个SQL对您有用吗?你收到错误消息了吗?问题是什么?Thanx。如果a想删除重复项并保留一个副本,这很好。我还有一个案例,现在我想删除重复项并保留一个特定数字的副本。我将脚本修改为you's welcome@EddyL。你可以试着接受这个看似有帮助的答案。对于新的要求,您应该问另一个问题。Thanx。如果您希望删除重复项并保留一个副本,这很好。我还有一个案例,现在我想删除重复项并保留一个特定数字的副本。我将脚本修改为you's welcome@EddyL。你可以试着接受这个看似有帮助的答案。对于新的要求,你应该问另一个问题。