7

我们有一个表,其中两次意外插入了相同的数据,这意味着大多数(但不是全部)行在表中出现了两次。简单地说,我想要一条 SQL 语句来删除一行的一个版本,同时保留另一个版本;我不介意删除哪个版本,因为它们是相同的。

表结构类似于:

FID、unique_ID、COL3、COL4....

Unique_ID是主键,意味着每个键只出现一次。 FID是每个功能唯一的键,因此如果它出现多次,则应删除重复项。

要选择具有重复项的功能,请执行以下操作:

select count(*) from TABLE GROUP by FID

不幸的是,我不知道如何从该语句转到 SQL 删除语句,该语句将删除无关的行,每行只留下一个。

之前已经问过这类问题,我已经尝试过使用 distinct 来创建表,但是如何在不命名的情况下获取所有列?这只获取单列 FID 并逐项列出要保留的所有列给出:ORA-00936: missing expression

CREATE TABLE secondtable NOLOGGING as select distinct FID from TABLE

4

5 回答 5

9

如果您不在乎保留哪一行

DELETE FROM your_table_name a
 WHERE EXISTS( SELECT 1
                 FROM your_table_name b
                WHERE a.fid = b.fid
                  AND a.unique_id < b.unique_id )

完成后,您需要向表中添加一个约束,以确保它FID是唯一的。

于 2012-05-10T15:38:24.443 回答
4

试试这个

DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B
WHERE A.FID = B.FID)
于 2012-05-10T15:38:57.220 回答
1

一条建议

DELETE FROM x WHERE ROWID IN
(WITH y AS (SELECT xCOL, MIN(ROWID) FROM x GROUP BY xCOL HAVING COUNT(xCOL) > 1)
SELCT a.ROWID FROM x, y WHERE x.XCOL=y.XCOL and x.ROWIDy.ROWID)
于 2012-05-10T15:38:21.487 回答
0

试试这个。

DELETE FROM firsttable WHERE unique_ID NOT IN 
(SELECT MAX(unique_ID) FROM firsttable GROUP BY FID)

编辑: 一种解释:

SELECT MAX(unique_ID) FROM firsttable GROUP BY FID;

此 sql 语句将从每个重复行组中选择每个最大 unique_ID 行。并且 delete 语句将保留这些最大的 unique_ID 行并删除每个重复组的其他行。

于 2012-05-10T19:14:29.210 回答
0

你可以试试这个。

delete from tablename a
where a.logid, a.pointid, a.routeid) in (select logid, pointid, routeid from tablename 
group by logid, pointid, routeid having count(*) > 1)
and rowid not in (select min(rowid) from tablename
group by logid, pointid, routeid having count(*) > 1)
于 2017-11-21T07:21:00.613 回答