Sql 删除副本并保留一份副本
我一直在讨论如何从表中删除重复项并保留一个副本。我看到了一个示例,其中一个示例有一个带有复合键的表。有人有这个想法吗 表CONT(带复合键checkno、薪资月、薪资年)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(*) >
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。你可以试着接受这个看似有帮助的答案。对于新的要求,你应该问另一个问题。