我在Oracle中正在测试某些内容,并使用一些示例数据填充了一个表格,但是在此过程中意外加载了重复记录,因此现在我无法使用某些列创建主键。
如何删除所有重复行并仅保留其中一个?
我在Oracle中正在测试某些内容,并使用一些示例数据填充了一个表格,但是在此过程中意外加载了重复记录,因此现在我无法使用某些列创建主键。
如何删除所有重复行并仅保留其中一个?
rowid
伪列。DELETE FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2, column3);
column1
,column2
和column3
是每个记录的标识键。您可以列出所有列。
From Ask Tom
delete from t
where rowid IN ( select rid
from (select rowid rid,
row_number() over (partition by
companyid, agentid, class , status, terminationdate
order by rowid) rn
from t)
where rn <> 1);
(修复了缺失的括号)
来自DevX.com:
DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3...) ;
在这里,column1、column2等是您想要使用的键。
DELETE FROM tablename a
WHERE a.ROWID > ANY (SELECT b.ROWID
FROM tablename b
WHERE a.fieldname = b.fieldname
AND a.fieldname2 = b.fieldname2)
delete from emp
where rowid not in
(select max(rowid) from emp group by empno);
delete from emp where rowid in
(
select rid from
(
select rowid rid,
row_number() over(partition by empno order by empno) rn
from emp
)
where rn > 1
);
delete from emp e1
where rowid not in
(select max(rowid) from emp e2
where e1.empno = e2.empno );
创建表t2,将t1中的所有不重复的数据选出来。
这篇博客文章对于常见情况非常有帮助:
如果行是完全重复的(所有列的所有值都可以有副本),则没有可以使用的列! 但是,为了保留一行,您仍然需要每个分组中每行的唯一标识符。 幸运的是,Oracle 已经有了您可以使用的东西。rowid。 Oracle 中的所有行都有 rowid。 这是一个物理定位器。也就是说,它指出 Oracle 存储行的磁盘位置。这对于每一行都是唯一的。 因此,您可以使用此值来识别和删除副本。要执行此操作,请在不相关的删除中用 min(rowid) 替换 min():
delete films
where rowid not in (
select min(rowid)
from films
group by title, uk_release_date
)
您应该使用游标循环编写一个小的PL/SQL块,并删除您不想保留的行。例如:
declare
prev_var my_table.var1%TYPE;
begin
for t in (select var1 from my_table order by var 1) LOOP
-- if previous var equal current var, delete the row, else keep on going.
end loop;
end;
create table abcd(id number(10),name varchar2(20))
insert into abcd values(1,'abc')
insert into abcd values(2,'pqr')
insert into abcd values(3,'xyz')
insert into abcd values(1,'abc')
insert into abcd values(2,'pqr')
insert into abcd values(3,'xyz')
select * from abcd
id Name
1 abc
2 pqr
3 xyz
1 abc
2 pqr
3 xyz
Delete Duplicate record but keep Distinct Record in table
DELETE
FROM abcd a
WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b
WHERE b.id=a.id
);
run the above query 3 rows delete
select * from abcd
id Name
1 abc
2 pqr
3 xyz
为了仅选择重复项,查询格式应为:
SELECT GroupFunction(column1), GroupFunction(column2),...,
COUNT(column1), column1, column2...
FROM our_table
GROUP BY column1, column2, column3...
HAVING COUNT(column1) > 1
其他建议的正确查询如下:
DELETE FROM tablename a
WHERE a.ROWID > ANY (SELECT b.ROWID
FROM tablename b
WHERE a.fieldname = b.fieldname
AND a.fieldname2 = b.fieldname2
AND ....so on.. to identify the duplicate rows....)
WHERE CLAUSE
条件的最早记录在数据库中。